Szczerze mówiąc, musiałbym powiedzieć, że myślę, że jesteś tu na uboczu.
Po pierwsze, rzeczywisty kod wysłany nie ma sensu; wątek roboczy oczekuje na sygnał, ale bez żadnego powodu - w rzeczywistości nie jest w pętli ani nie czeka na zasób. Po drugie, jeśli potrzebujesz wykonać (prawdopodobnie pominięty) kod czyszczenia w module roboczym po otrzymaniu sygnału zamknięcia, twoja usługa może nie dać pracownikowi wystarczającej ilości czasu na oczyszczenie.
Ale bardziej fundamentalnie, wszystko, co zrobiłeś, to przenieść problem do osobnego wątku. Dzięki temu usługa może reagować na kontroler usługi, ale nie rozwiązuje problemu z projektowaniem - i dodaje wiele niepotrzebnej złożoności, używając wątków i muteksów; w ostatecznym rozrachunku sprawi to, że twoja usługa będzie trudniejsza w debugowaniu, jeśli zajdzie taka potrzeba.
Załóżmy, że musisz wykonać kod co 5 sekund. Chodzi o to, że zamiast "czekać" 5 sekund, odwracasz kontrolę i pozwalasz timerowi wywoływać twoją pracę.
To jest złe:
protected override void OnStart(string[] args)
{
while (true)
{
RunScheduledTasks(); // This is your "work"
Thread.Sleep(5000);
}
}
To jest dobre:
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
}
}
To wszystko. To wszystko, co musisz zrobić, aby wykonywać pracę w regularnych odstępach czasu. Dopóki praca nie będzie działać przez kilka sekund, twoja usługa będzie reagować na kontroler usługi. Można nawet wspierać zatrzymując w tym scenariuszu:
protected override void OnPause()
{
workTimer.Change(Timeout.Infinite, Timeout.Infinite);
base.OnPause();
}
protected override void OnContinue()
{
workTimer.Change(0, 5000);
base.OnContinue();
}
Jedyny czas, kiedy trzeba rozpocząć tworzenie wątków roboczych w usłudze jest, gdy sama praca może trwać bardzo długo i trzeba zdolność do odwołania w środek. To często wymaga dużego nakładu pracy nad projektem, więc nie będę się z tym wiązał, nie wiedząc na pewno, że jest to związane z twoim scenariuszem.
Najlepiej nie zaczynać wprowadzania semantyki wielowątkowej w swojej usłudze, chyba że naprawdę jej potrzebujesz. Jeśli chcesz tylko zaplanować małe, pracujące jednostki, to zdecydowanie nie potrzebujesz tego.
Dlaczego nazwy zmiennych są pisane wielką literą? –
Nie. Naprawione. –