Timer (System.Threading) thread safety

2019-02-25 21:49发布

Does anyone know if this code would be thread safe, or do I have to use lock when calling timer2.Change?

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);
}

2条回答
ゆ 、 Hurt°
2楼-- · 2019-02-25 22:05

It's "thread-safe" in the sense that the call to Change won't actually corrupt the timer.

However, it's not "thread-safe" in the sense that you definitely have a race condition (it's not possible to ensure that timerCallback2 isn't running when you're in DoStuff).

查看更多
家丑人穷心不美
3楼-- · 2019-02-25 22:05

Per MSDN documentation the Timer type is thread safe, so the only place you have to be careful is where you call DoStuff();.

查看更多
登录 后发表回答