程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 別拿Thread當定時器使用

別拿Thread當定時器使用

編輯:C#入門知識

經常可以看到很多程序使用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一般都有幾百個線程- -#

      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved