Вот фрагмент моего кода:
protected override void OnStart(string[] args)
{
try
{
string source = "MyRemoteAgent";
_serviceIsRunning = true;
JsonFileManager.ClearJsonFile();
if (!EventLog.SourceExists(source))
{
EventLog.CreateEventSource(source, "Application");
}
EventLog.WriteEntry(source, "MyRemoteAgent started.");
// Starting threads
new Thread(AcceptTCPClient).Start();
new Thread(TCPSender).Start();
new Thread(SyncMonitorOpenWindows).Start();
}
catch (Exception ex)
{
EventLog.WriteEntry(source, $"Error in OnStart: {ex.Message}", EventLogEntryType.Error);
}
}
В режиме отладки служба работает должным образом, и все три потока выполняются без каких-либо проблем.
В режиме выпуска служба запускается (проверено через Event Log), но потоки, похоже, не выполняются.
Исключения не перехватываются в блоке catch.
Как устранить эту проблему в режиме выпуска? Есть ли лучший подход к запуску потоков в службе Windows на C#?
Что я пробовал:
- Добавлено дополнительное ведение журнала, чтобы проверить, запускаются ли потоки, но в режиме выпуска журналы не отображаются.
- Отключена оптимизация компилятора для конфигурации выпуска, но проблема остается.
- Заменен новый Thread().Start() на Task.Run(), но поведение такое же.
- Проверено, что все зависимости присутствуют в папке Release.
- Добавлен Thread.Sleep () после запуска потоков, чтобы дать им время на инициализацию, но это не помогло.
{
try
{
TcpListener listener = new TcpListener(IPAddress.Any, 6357);
listener.Start();
JsonFileManager.InitializeJsonFile();
while (_serviceIsRunning)
{
TcpClient tcpClient = listener.AcceptTcpClient();
ServiceProcess serviceProcess = new ServiceProcess(_commandsToSend);
Client client = new Client(tcpClient, serviceProcess);
client.AddConnection();
}
listener.Stop();
}
catch (Exception ex)
{
EventLog.WriteEntry("MyRemoteAgent", $"Error in AcceptTCPClient: {ex.Message}", EventLogEntryType.Error);
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ng-fine-in