簡體   English   中英

在Windows服務中使用Thread.Sleep()

[英]Using Thread.Sleep() in a Windows Service

我正在寫一個需要長時間睡眠的Windows服務(15小時是最長的睡眠,30分鍾是最短的)。 我目前正在使用Thread.Sleep(calculatedTime)將我的代碼置於睡眠模式。 Thread.Sleep是最佳選擇還是我應該使用計時器? 我已經谷歌搜索了一段時間,無法找到簡明的答案。 由於這是一個Windows服務,我不必擔心鎖定UI,所以我想不出不使用Thread.Sleep的原因。

任何見解將不勝感激。

我會使用一個計時器,Thread.Sleep,可能會導致阻止服務關閉的阻塞。

如果間隔是廣泛的,並且是常規的,您也可以只安排它。 但是如果你談的是長的,不一致的間隔,那么定時器會更好。

由於服務控制管理器可能會要求服務隨時停止,因此您的線程應始終准備好響應這些請求,因此不應使用Thread.Sleep()。 相反,在主線程中創建一個手動重置事件,並使用其WaitOne方法在工作線程中超時。 當時間到期時,WaitOne將返回false。

調用服務類的OnStop或OnShutdown方法時,設置事件並使WaitOne返回true,然后退出工作線程。

在很多情況下,通常認為使用Thread.Sleep()是不好的做法。

如果您希望服務在后台運行,則應使用計時器。

如果服務只需要按計划的時間間隔運行,我建議您考慮使用Windows任務計划程序,以允許Windows在您需要時運行該應用程序。

你不應該預先計算這么長的時間並且睡幾個小時。 最好睡一分鍾,然后醒來並重新計算時間,再睡一分鍾。 我假設計算非常便宜,或者可以通過緩存使其非常便宜。 我的建議試圖緩解的問題是計算機時鍾令人驚訝地“跳躍”,主要是由於網絡時間服務糾正了時間偏差,也是因為節省了日光,尤其是因為用戶調整時鍾。 因此,最好不斷重新計算這么長時間間隔的時間,即使這意味着每分鍾都會醒來。 如果你在“過去”中醒來,時鍾可以及時調整,也不要感到驚訝(即不要斷言)。

另一件需要考慮的事情是線程是有限的資源,每個線程為其堆棧消耗一部分內存(1MB?)。 它們還可能增加調度程序的負載。

現在,如果您的服務沒有做太多其他浪費的空間是微不足道的,但在開始分配多個線程之前明智地注意這一點。 使用ThreadPool和/或Timers效率更高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM