Исключение, заявляющее, что mainForm удаляется при выполнении события таймера - PullRequest
0 голосов
/ 12 февраля 2010

У меня есть выигрышная форма, которая использует System.Timers.Timer. Когда таймер выполняется, он обновляет переменную в mainForm. Я получаю исключение, сообщающее, что mainForm был удален. Что я делаю неправильно. Если я достану обновление переменной, программа будет работать нормально. Если я пытаюсь прочитать переменную и отправить ее в окно сообщения, все работает нормально. Только когда я пытаюсь изменить значение переменной из обработчика события таймера, я получаю исключение. Что происходит?

//works
private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
       MessageBox.Show(myVarFromMainForm);
    }
//does not work
private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        myVariableFromMainForm = 10;
    }

1 Ответ

0 голосов
/ 12 февраля 2010

Маловероятно, что код размещен как бомбы на ObjectDisposed. Тем не менее, получение исключения не удивительно, когда вы используете System.Timers.Timer. У вас есть , чтобы убедиться, что таймер выключен до закрытия формы. Невыполнение этого условия позволяет запускать событие Elapsed, когда объект формы мертв.

Большая проблема в том, что практически невозможно гарантировать, что таймер действительно остановлен. Существует неизбежное состояние гонки, событие Elapsed, возможно, уже запланировано для запуска, пока вы останавливаете таймер. Есть разные, неприятные вещи, которые вы можете сделать с этим. Но прежде чем идти туда, убедитесь, что System.Windows.Forms.Timer не решит вашу проблему. Это синхронный таймер, он никогда не будет отмечаться после закрытия формы. Это также позволяет избежать неприятных проблем с потоками, с которыми вы можете столкнуться при доступе к членам класса в событии Elapsed без использования оператора блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...