2010-06-16 4 views
2

Кто-нибудь знает, будет ли этот код потокобезопасным, или мне нужно использовать блокировку при вызове timer2.Change?Таймер (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 воны Фактически поврежден таймер.

Однако это не «поточно-безопасный» в том смысле, что у вас определенно есть условие гонки (невозможно, чтобы timerCallback2 не работал, когда вы в DoStuff).

+0

Спасибо, да, возможно, я сделаю Сон перед DoStuff(), чтобы дать таймеру Callback2 время, чтобы закончить, или я просто добавлю замок. – remdao

2

Per MSDN документации тип таймера поточно, поэтому единственное место, где вы должны быть осторожны, где вы звоните DoStuff();.

+0

Я читаю «Любые члены экземпляра _not_ thread-safe». http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx –

+1

@Henk: это класс System.Timers, а не Threading.Timer Class, который является потокобезопасным –

+0

Да, вы «Правильно, извините. Неправильный таймер. –

Смежные вопросы