Мне нужно запустить сокет, который всегда прослушивается как служба Windows.
Я делаю это в C #
У меня есть исполняемая версия моей программы, которая использует следующий код
Console.WriteLine("sock1");
SynchronousSocketListener synchronousSocketListener = new SynchronousSocketListener();
synchronousSocketListener.StartListening();
Console.WriteLine("sock2");
Этот код работает при запуске программы в качестве исполняемого файла, но не работает при запуске в качестве службы, поскольку прослушиватель сокетов никогда не возвращается и, таким образом, блокирует запуск службы. («sock2» никогда не печатает)
Я попробовал следующий код для асинхронного запуска прослушивателя сокетов (это было сделано в исполняемой версии программы, а не в версии servicce, поэтому существует метод main, а не метод onStart.
class Program
{
public static int Main(String[] args)
{
Console.WriteLine("sock1");
Program a = new Program();
var blah = a.startSocketListenerAsync();
Console.WriteLine("sock2");
Thread.sleep(1000000);
return 0;
}
public async Task<string> startSocketListenerAsync()
{
SynchronousSocketListener synchronousSocketListener = new SynchronousSocketListener();
await Task.Run( () => synchronousSocketListener.StartListening() );
return "hello world";
}
}
Это запускает прослушиватель сокетов асинхронно (печатает sock2), если я установил достаточно длительный период ожидания, проблема в том, что эта программа завершается, как только основной поток завершает работу (закрывая с ним поток сокетов)
Как я могу заставить это работать как услуга?