2010-06-16 49 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