2010-06-16 19 views
2

有誰知道這段代碼是否線程安全,或者在調用timer2.Change時是否必須使用lock?定時器(System.Threading)線程安全

Timer timer1 = new Timer(timerCallback1); 
Timer timer2 = new Timer(timerCallback2); 
timer1.Change(5000, 5000); 
timer2.Change(3000, 3000); 

public void timerCallback1(object state) 
{ 
    timer1.Change(Timeout.Infinite, Timeout.Infinite); 
    timer2.Change(Timeout.Infinite, Timeout.Infinite); 

    DoStuff(); 

    timer1.Change(5000, 5000); 
    timer2.Change(3000, 3000); 
} 

回答

5

這是在這個意義上「線程安全」的呼叫Change韓元實際上並沒有損壞計時器。

然而,從某種意義上說,您確實存在競爭狀況(在DoStuff中無法確保timerCallback2未運行),因此它不是「線程安全」的。

+0

謝謝,是的,也許我會在DoStuff()之前做一個Sleep,給TimerCallback2時間來完成,否則我只是添加一個鎖。 – remdao 2010-06-17 08:35:57

2

每MSDN文檔定時器類型是線程安全的,所以你必須要小心的地方是,你叫DoStuff();.

+0

我讀過「任何實例成員都不是線程安全的」。 http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx – 2010-06-16 14:26:13

+1

@亨克:這是在System.Timers類,而不是Threading.Timer類,這是線程安全的 – 2010-06-16 14:37:43

+0

是的,你對,對不起。錯誤的計時器再次。 – 2010-06-16 15:08:53