Я пытаюсь создать службу Windows, используя C #.Служба должна открыть TCPListener на порту 5089 и запустить диспетчеризацию команд.Но если я добавлю код инициализации TCPListener и начну диспетчеризацию потока в метод службы OnStart (), моя служба не запустится (Панель администратора -> Администрирование -> Службы -> MyService -> Запуск)
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 service?
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();
}
}