В моем приложении .NET у меня постоянно работает поток в фоновом режиме, который будет вызывать события, когда определенные данные поступают на последовательный порт.Возбужденное событие содержит ход выполнения операции (калибровки), выполняемой оборудованием, подключенным к этому порту.
Я хочу отобразить ход выполнения этой операции для пользователя, поэтому я создал форму с ходом выполнения.бар с именем ProgressBarCal
.Чтобы синхронизировать операцию с графическим интерфейсом, я использую Form.BeginInvoke()
. Проблема в том, что, поскольку фоновый поток выходит из формы, он может генерировать события во время удаления формы, что приводит к ObjectDisposedException
при выполнении ProgressBarCal.Value = e.progress
.Я решил использовать следующую стратегию, чтобы избежать создания исключения:
Private Sub OnCalibrationProgressReport(sender As Object, e As CalibrationEventArgs)
If InvokeRequired Then
BeginInvoke(Sub() OnCalibrationProgressReport(sender, e))
Return
End If
Try
If e.timeout Then 'if the operation timeout we tell user
MessageBox.Show("Calibration timeout.")
Else
ProgressBarCal.Value = e.progress 'otherwise we display progress
End If
Catch ex As ObjectDisposedException When Me.IsDisposed
'ignore this exception
End Try
End Sub
Использование When Me.IsDisposed
после Catch ex As ObjectDisposedException
обеспечит только исключение ObjectDisposedException, которое я хочу игнорировать (основываясь на моем вопросе)игнорируются, что делает этот код надежным?