Re[3]: Timer: остановить, дождаться завершения... Покритикуй
От: AK107  
Дата: 20.09.10 10:34
Оценка:
Здравствуйте, 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 и ставить его как до так и после рестарта таймера, тк они не связаны в атомарную операцию.

з.ы. то, что работает без ошибок я в принципе знал (скромно так ), я больше хочу услышать критику и возможные шаги по упрощению кода.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.