Я реализовал службу Windows в .NET 4 и C # с использованием Visual Studio 2015. В методе OnStart
моя служба создает «рабочий поток», который зацикливается, блокируя на AutoResetEvent
(подключенном к Timer
). «Рабочий поток» также имеет CancellationTokenSource
, который он вручную опрашивает, чтобы проверить, следует ли прекратить работу. Метод OnStop
сначала отменяет с помощью CancellationTokenSource, а затем сигнализирует с помощью AutoResetEvent, пробуждая рабочий поток, который замечает, что произошло «отмена», и который затем завершается.
Эта служба Windows прекрасно работает на Win7. Я установил его на Win10 несколько раз, и он работал нормально - до вчерашнего дня, когда я увидел файл журнала, в котором говорилось, что рабочий поток, как и ожидалось, заблокирован на AutoResetEvent, но: этот рабочий поток никогда не доходил до следующего оператора в моемпрограмма. Он никогда не просыпался, не выполнял другого заявления. Через 94 секунды после блокировки служба завершилась.
Обратите внимание, что в этом случае мой OnStop
метод не был вызван .
Процесс в целом не былkill - есть поток, который входит (threadID 1) предположительно из SCM или ОС, и который блокирует, пока моя служба не умрет - , что поток записал несколько сообщений при выходе.
Вот мой вопрос: существуют ли условия, когда диспетчер управления службами Windows (SCM) считает необходимым фактически уничтожить потоки приложения? Кто-нибудь может объяснить, почему умерла моя тема?