views:

84

answers:

2

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  A: 

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

Tony
I read "Any instance members are _not_ thread-safe". http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
Henk Holterman
@Henk: Thats in the System.Timers class, not the Threading.Timer Class, which is thread safe
Tony
Yes, you're right, sorry. Wrong timer again.
Henk Holterman
+2  A: 

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).

Stephen Cleary
Thanks, yes maybe I'll do a Sleep before DoStuff() to give timerCallback2 time to finish, or I'll just add a lock.
remdao