2013-02-26 5 views
-1

Вот обзор того, на что я нацелен:Приостановка Windows Service thread?

У меня есть служба Windows, которая вначале проверит наличие конкретной базы данных на этом сервере для любых доступных очередей. Если очередь найдена, она должна начать обработку (довольно просто и прямо). Если очередей не найдено, мне нужна услуга для сортировки «сна» в течение 15 минут, а затем «перезагрузка». Если очереди найдены, начните обработку, иначе спящие еще 15 минут и «перезапустите».

Как я могу это сделать? Я посмотрел на метод System.Threading.Sleep, но, по-видимому, это очень плохое кодирование. Я понимаю, что спящий поток, блокирует любые последующие методы, которые выполняются, что хорошо - как после Света служба будет вызывать тот же метод для «перезапуска» обработки.

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

Каков наилучший способ приостановить поток обслуживания в течение 15 минут, а затем снова вызвать метод обработки. Он должен оставаться в цикле постоянной проверки доступных очередей. Как только один найден, выполните обработку, и если ни один не найден, просто спите в течение 15 минут?

ответ

0

Если вы действительно хотите спать, вы просто вызываете Thread.Sleep. В самых основных чертах, основной цикл выполнения вашего потока будет выглядеть следующим образом:

while (true) 
{ 
    if (!queue.processItem()) 
     Thread.Sleep(...); 
} 

Вы не должны вызывать Thread.Sleep в главном потоке службы. Назовите его в фоновом потоке. Таким образом, идея состоит в том, что основной поток обслуживания остается живым и готовым обрабатывать любые служебные сообщения. И фоновый поток выполняет фактическую работу.

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

+0

Обратите внимание, что основная служебная нить не обязательно (обязательно) должна оставаться в живых; диспетчер служб создает собственный поток для вызова функции обработчика. Конечно, если ваша функция обработчика отправляет сообщения в основной поток службы, вам нужно их слушать. :-) –