У меня была та же проблема, и я решил ее, используя логический флаг, который устанавливается при закрытии формы (System.Timers.Timer не имеет свойства IsDisposed). Везде на форме я запускал таймер, он проверял этот флаг. Если он был установлен, то не запускайте таймер. Вот причина:
Причина:
Я останавливал и использовал таймер в событии закрытия формы. Я запускал таймер в событии Timer_Elapsed (). Если бы я должен был закрыть форму в середине события Timer_Elapsed (), таймер был бы немедленно уничтожен событием Form_Closing (). Это произойдет до того, как событие Timer_Elapsed () завершится, и, что более важно, до того, как оно достигнет этой строки кода:
_timer.Start()
Как только эта строка будет выполнена, ObjectDisposedException () будет выдано с ошибкой, которую вы упомянули.
Решение:
Private Sub myForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
' set the form closing flag so the timer doesn't fire even after the form is closed.
_formIsClosing = True
_timer.Stop()
_timer.Dispose()
End Sub
Вот событие, прошедшее с таймера:
Private Sub Timer_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles _timer.Elapsed
' Don't want the timer stepping on itself (ie. the time interval elapses before the first call is done processing)
_timer.Stop()
' do work here
' Only start the timer if the form is open. Without this check, the timer will run even if the form is closed.
If Not _formIsClosing Then
_timer.Interval = _refreshInterval
_timer.Start() ' ObjectDisposedException() is thrown here unless you check the _formIsClosing flag.
End If
End Sub
Интересно знать, что, хотя при попытке запуска таймера он вызывает исключение ObjectDisposedException, таймер все равно запускается, вызывая его запуск, даже когда форма закрыта (поток останавливается только при закрытии приложения) .