Безопасность таймера (System.Threading)
Кто-нибудь знает, будет ли этот код потокобезопасным, или мне нужно использовать блокировку при вызове 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);
}
Ответы
Ответ 1
Он "потокобезопасен" в том смысле, что вызов Change
фактически не повредит таймер.
Однако он не "потокобезопасен" в том смысле, что у вас определенно есть условие гонки (невозможно гарантировать, что timerCallback2
не работает, когда вы находитесь в DoStuff
).
Ответ 2
В документации по MSDN тип таймера является потокобезопасным, поэтому единственное место, где вам нужно быть осторожным, - это вызывать DoStuff();.