2010-06-16 3 views
2

Est-ce que quelqu'un sait si ce code serait thread-safe, ou dois-je utiliser le verrouillage lors de l'appel de timer2.Change?Sécurité de thread Timer (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); 
} 

Répondre

5

Il est « thread-safe » dans le sens que l'appel à Change gagné Ne corrompez pas la minuterie.

Cependant, ce n'est pas "thread-safe" dans le sens où vous avez définitivement une condition de concurrence (il n'est pas possible de s'assurer que timerCallback2 ne fonctionne pas lorsque vous êtes dans DoStuff).

+0

Merci, oui peut-être que je vais faire un Sleep avant DoStuff() pour donner à timerCallback2 le temps de finir, ou je vais juste ajouter un verrou. – remdao

2

Par documentation MSDN type Timer est thread-safe, donc le seul endroit où vous devez faire attention est l'endroit où vous appelez DoStuff();.

+0

Je lis "Tous les membres d'instance sont _not_ thread-safe". http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx –

+1

@Henk: Thats dans la classe System.Timers, pas la classe Threading.Timer, qui est thread sûr –

+0

Oui, vous Je suis juste, désolé. Mauvais minuteur à nouveau. –