私はC#を使用してWindowsサービスを作成しようとしています。サービスは、5089ポートでTCPListenerを開き、ディスパッチコマンドを開始する必要があります。しかし、私は私のTCPListener初期化コードを入れてのOnStart()サービスメソッド、私のサービスではありません開始にディスパッチスレッドを開始する場合(管理パネル - >管理 - >サービス - > MyServiceで - >スタート)C#windows service writing
protected override void OnStart(string[] args)
{
_server = new CommandServer("LocalCommandServer", "192.168.10.150", false);
_server.Initialize("LocalCommandServer", "192.168.10.150"); // In this method starts dispatching thread
}
protected override void OnStop()
{
_server.Dispose();
}
私が開始することができますどのように私のTCPListener
とWindowsサービスのディスパッチスレッド?
public class CommandServer : IDisposable
{
private IPAddress _serverIP;
private bool _mayDispatch;
public string Name { get; set; }
private Queue<string> _commandsQueue;
private TcpListener _commandListener;
private Thread _commandListenerThread;
private Thread _mainThread;
public CommandServer(string name, string serverIP, bool initialize)
{
if (initialize)
Initialize(name, serverIP);
}
public bool Initialize(string name, string serverIP)
{
_serverIP = IPAddress.Parse(serverIP);
_mayDispatch = true;
Name = name;
_commandsQueue = new Queue<string>();
_commandListener = new TcpListener(_serverIP, 5089);
_commandListenerThread = new Thread(TcpListenerThread);
_commandListener.Start();
_commandListenerThread.Start();
_mainThread = Thread.CurrentThread;
StartDispatching();
return true;
}
private void StartDispatching()
{
while (_mayDispatch)
{
if (_commandsQueue.Count > 0)
DispatchCommand(_commandsQueue.Dequeue());
}
_commandListener.Stop();
_commandListenerThread.Abort();
}
public void DispatchCommand(string cmnds)
{
var cmnd = cmnds.Split(' ');
switch (cmnd[0].ToLower())
{
case "terminate":
_mayDispatch = false;
break;
case "start":
var proc = new Process
{
StartInfo =
{
FileName = cmnd[1],
CreateNoWindow = false,
UseShellExecute = true
}
};
proc.Start();
break;
}
}
public void TcpListenerThread()
{
while (true)
{
var client = _commandListener.AcceptTcpClient();
if (client.Connected)
{
var clientStream = client.GetStream();
var buff = new List<byte>();
while (clientStream.CanRead)
{
var b = clientStream.ReadByte();
if (b == -1)
break;
buff.Add((byte)b);
}
var command = Encoding.ASCII.GetString(buff.ToArray());
_commandsQueue.Enqueue(command);
System.Diagnostics.Debug.WriteLine("Queued: " + _commandsQueue.Count);
}
else
{
System.Diagnostics.Debug.WriteLine("Not connected");
}
}
}
public void Dispose()
{
_commandListener.Stop();
_commandListenerThread.Abort();
}
}
コードが正しく動作します。 OnStart()でwhile(true)を指定してディスパッチスレッドを起動しようとすると、OnStart()が終了せず、起動時にサービスが開始されません。 –
@ Evl-ntntコードの一部を見ることができますか? – Incognito
更新された質問 –