почему Windows 10 убила мой рабочий поток в моей службе Windows? - PullRequest
0 голосов
/ 10 ноября 2019

Я реализовал службу 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) считает необходимым фактически уничтожить потоки приложения? Кто-нибудь может объяснить, почему умерла моя тема?

1 Ответ

0 голосов
/ 11 ноября 2019

Короткий ответ на оригинальный вопрос

Я обнаружил, что перезапуск машины привел к смерти моего потока (интересно, что поток, выделенный Windows, не умер, он просто вышел - я думаю, именно так SCM очищаетдо служб, когда ему говорят, что нужно отключиться).

Более длинный ответ - Теперь у меня новый вопрос

Я не осознавал, что я лаю не на том дереве. В моем клиентском приложении говорилось, что служба недоступна, и я предположил, что это из-за того, что я описал выше - потому что ее убивали.

Не проблема - проблема была в том, что как только служба была остановлена ​​(из-за выключения), она не перезапускалась снова!

Так почему же моя служба .NET 4 Automatic не запустилась автоматически в Win10? Это другой вопрос.

Новый ответ

С тех пор, как я разместил свой оригинальный вопрос, я нашел несколько сообщений, которые отвечают на новый вопрос:

...