經常可以看到很多程序使用Thread當作定時器(Timer)使用,例如定時檢查數據,定時清空緩存什麼的
就像以下代碼
代碼Thread t = new Thread(p =>
{
while (true)
{
//做點什麼...例如刷新數據 操作緩存 和其他定時任務
Thread.Sleep(10000);
}
});
t.Start();
可能有的朋友已經注意到,在壓力比較大的Asp.net網站中這個Thread經常不能正常的工作,也許這個線程會永遠不會再起來.......那麼定時任務也就泡湯了
PS:如果是console的主線程 (標記了STAThreadAttribute ) 則可以正常的蘇醒和睡眠
另外一個原因就是每個Thread都是很昂貴的,能不用就不用,
一般情況下建議使用System.Threading.Timer 來執行定時任務
1)System.Threading.Timer由核心模式(Kernel-Mode)觸發,不會發生任務跑著跑著沒掉的慘案
2)記得將Timer變量放在類的實例成員或者靜態成員上,以免Release模式下Timer被GC了(我的另外一個文章有提到這個情況)
3)Timer設置定時執行以後,假設到了第二次的執行時間,即使第一次還沒有執行完,那麼第二次也會開始,可以考慮使用以下兩種方案防止多次執行的沖突
a.Timer設置為只執行一次 ,在Timer調用方法的最後一句,重置一下Timer.Change(int dueTime,int period);
b.使用一個變量表示當前是否有定時器正在執行,建議用InterLocked操作一個int變量來表示
PS:不是很推薦使用
1) System.Timers.Timer 其實是對 System.Threading.Timer的封裝
2) System.Windows.Forms.Timer ,基於消息機制
PS:windows大約30ms才考慮一次線程切換....而且windows一般都有幾百個線程- -#