Подтвердить что ты не робот

Использование Thread.Sleep() в службе Windows

Я пишу службу Windows, которая должна спать длительное время (15 часов - это самый длинный, который он будет спать, 30 минут является самым коротким). В настоящее время я использую Thread.Sleep(calculateTime), чтобы перевести мой код в спящий режим. Является ли Thread.Sleep лучшим вариантом или я должен использовать таймер? Я искал это некоторое время и не могу найти краткий ответ. Поскольку это служба Windows, мне не нужно беспокоиться о блокировке пользовательского интерфейса, поэтому я не могу придумать причину не использовать Thread.Sleep.

Любое понимание будет оценено.

4b9b3361

Ответ 1

Я бы использовал таймер, Thread.Sleep, может вызвать блокировку, которая может помешать отключению службы.

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

Ответ 2

Поскольку службе может быть предложено в любое время остановить диспетчер управления службами, ваш поток всегда должен быть готов ответить на эти запросы, поэтому вам не следует использовать Thread.Sleep(). Вместо этого создайте в главном потоке событие manual- reset и используйте его метод WaitOne с тайм-аутом в рабочем потоке. WaitOne вернет false, когда истечет время.

Когда вы вызываете методы класса OnStop или OnShutdown, задайте это событие, и это приведет к тому, что WaitOne вернет true, и вы сможете выйти из рабочего потока.

Ответ 3

Обычно во многих случаях использовать Thread.Sleep() в качестве плохой практики.

Если вы хотите, чтобы служба запускалась в фоновом режиме, вы должны использовать таймер.

Если услугу нужно запускать только через запланированные промежутки времени, я бы рекомендовал вам изучить использование планировщика задач Windows, чтобы Windows могла запускать приложение, когда оно вам нужно.

Ответ 4

Вы не должны предварительно вычислять такие большие количества времени и спать в течение нескольких часов. Спите минутку в лучшем случае, затем проснитесь и пересчитайте время, спите снова не более минуты. Я предполагаю, что расчет очень дешевый или его можно сделать очень дешевым с кешированием. Проблема, которую мой совет пытается смягчить, заключается в том, что компьютерные часы удивительно "прыгающие", в основном из-за временного дрейфа, исправленного службой сетевого времени, также из-за экономии дневного света и не в последнюю очередь потому, что пользователь настраивает часы. Поэтому лучше постоянно пересчитывать время для таких длинных интервалов, даже если это означает просыпаться каждую минуту или около того. И не удивляйтесь (т.е. Не утверждайте), если вы просыпаетесь в прошлом, часы могут корректироваться во времени.

Ответ 5

Еще одна вещь, которую следует учитывать, это то, что потоки являются конечными ресурсами, и каждый поток потребляет часть памяти (1 МБ?) для своего стека. Они также могут увеличить нагрузку для планировщика.

Теперь, если ваша служба не делает ничего другого, потраченное впустую пространство тривиально, но разумно знать об этом, прежде чем вы начнете выделять несколько потоков. Использование ThreadPool и/или Таймеров намного эффективнее.