Здравствуйте, achmed, Вы писали:
A>Попробуй проверить c CHESS
потестил: вместо таймера стартовал поток из которого вызывался Work, из другого же поток звал stop и wait.
говорит все гуд.
подтвердил лишь для себя следующие моменты:
void Work(object sender, System.Timers.ElapsedEventArgs e)
{
lock (locker)
{
// проверка если вызов был уже произведен ("запланирован") когда устанавливали флаг/останавливали таймер
if (stop)
return;
evIdle.Reset(); // <-- 1*
}
// имитация длительной операции
Thread.Sleep(3000);
lock (locker)
{
if (!stop)
timer.Start();
evIdle.Set(); // 1-- 2*
}
}
1* — evIdle.Reset нельзя выносить за lock, тк Stop и Wait могут быть вызваны между блоком lock и evIdle.Reset.
2* — evIdle.Set можно выносить за lock и ставить его как до так и после рестарта таймера, тк они не связаны в атомарную операцию.
з.ы. то, что работает без ошибок я в принципе знал (скромно так
), я больше хочу услышать критику и возможные шаги по упрощению кода.