Таймер (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);
}

2 ответа

Решение

Это "потокобезопасный" в том смысле, что вызов Change на самом деле не повредит таймер.

Тем не менее, это не "потокобезопасный" в том смысле, что у вас определенно есть состояние гонки (невозможно гарантировать, что timerCallback2 не работает, когда вы находитесь в DoStuff).

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

Другие вопросы по тегам