Честно говоря, я должен был бы сказать, что я думаю, что вы немного сбились с пути.
Прежде всего, фактический код не имеет смысла; рабочий поток ожидает сигнала, но без причины - на самом деле он не находится в каком-либо цикле или ожидает ресурса. Во-вторых, если вам нужно было выполнить какой-то (возможно, пропущенный) код очистки на рабочем месте после получения сигнала завершения работы, ваша служба может не дать рабочему потоку достаточно времени для очистки.
Но, что более важно, все, что вы сделали, это перенесли проблему в отдельный поток. Это может держать службу отзывчивой к контроллеру службы, но это не решает проблему проектирования - и это добавляет много ненужной сложности с использованием потоков и мьютексов; в конечном счете, это только усложнит отладку вашего сервиса, если вам когда-либо понадобится.
Допустим, вам нужно выполнять некоторый код каждые 5 секунд. Идея состоит в том, чтобы вместо «ожидания» 5 секунд вы инвертировали элемент управления и позволяли таймеру вызывать вашу работу.
Это плохо:
protected override void OnStart(string[] args)
{
while (true)
{
RunScheduledTasks(); // This is your "work"
Thread.Sleep(5000);
}
}
Это хорошо:
public class MyService : ServiceBase
{
private Timer workTimer; // System.Threading.Timer
protected override void OnStart(string[] args)
{
workTimer = new Timer(new TimerCallback(DoWork), null, 5000, 5000);
base.OnStart(args);
}
protected override void OnStop()
{
workTimer.Dispose();
base.OnStop();
}
private void DoWork(object state)
{
RunScheduledTasks(); // Do some work
}
}
Вот и все. Это все, что вам нужно сделать, чтобы делать работу через равные промежутки времени. Пока сама работа не выполняется в течение нескольких секунд, ваша служба будет реагировать на контроллер службы. Вы можете даже поддержать паузу в этом сценарии:
protected override void OnPause()
{
workTimer.Change(Timeout.Infinite, Timeout.Infinite);
base.OnPause();
}
protected override void OnContinue()
{
workTimer.Change(0, 5000);
base.OnContinue();
}
Единственный раз, когда вам нужно начать создавать рабочие потоки в вашем сервисе, это когда сама работа может выполняться очень долго, и вам нужна возможность отмены в середине. Это, как правило, требует значительных усилий по проектированию, поэтому я не буду вдаваться в это, не зная наверняка, что это связано с вашим сценарием.
Лучше не начинать внедрять многопотоковую семантику в ваш сервис, если вам это действительно не нужно. Если вы просто пытаетесь запланировать выполнение небольших задач, вам это точно не нужно.