это разумная стратегия для потока в службе Windows - PullRequest
0 голосов
/ 15 февраля 2011

В моем OnStart я установил для реестра HKLM значение «Да».

Затем я создаю экземпляр класса ac #, который запускает один из его методов в виде потока.

Метод обрабатывает записииз удаленного сервиса затем спит.

Когда он просыпается, если ключ реестра все еще "Да", он обрабатывает больше записей из удаленного источника.

OnStop устанавливает ключ HKLM в "Нет""и возвращает.

Я не уверен, что происходит за кулисами ... кажется, есть по крайней мере две возможности.

(A) служба останавливается после выхода из OnStop, нопоток продолжает работать до тех пор, пока не проснется и не выйдет.

(B) служба ожидает завершения потока и затем тоже завершается.

Я предполагаю (A), но я действительно это делаюне знаю.

В любом случае, это разумная стратегия?Thnx / г.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2011

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

Используйте переменную bool "keepRunning" вместо использования реестра. Имейте параметр / переменную "workInterval", который указывает, как часто следует выполнять работу, но установите достаточно короткий интервал сна, скажем, каждые несколько секунд, для пробуждения и проверки переменной "keepRunning" достаточно часто, чтобы служба могла реагировать на останов команда. Если тест keepRunning ложен, просто выйдите из основного цикла, и ваш процесс обслуживания завершится. Если «keepRunning» имеет значение true, то проверьте, пора ли выполнять работу, выполнить работу, если пришло время, а затем снова уснуть. Если работа длится долго, попробуйте периодически проверять переменную keepRunning из своего рабочего цикла, чтобы вы могли сохранить состояние и корректно выйти, если служба должна была завершиться.

Ваш обработчик OnStop просто установит «keepRunning» в false и больше ничего не будет делать. Таким образом, вам не нужно принудительно убивать работника чем-то вроде Thread.Abort, и сервисный процесс будет остановлен в течение нескольких секунд после события OnStop.

0 голосов
/ 15 февраля 2011

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

...