Я знаком со следующим:
"Если операция вызывает исключение, которое ваш код не обрабатывает, BackgroundWorker перехватывает исключение и передает его в обработчик события RunWorkerCompleted, где оно отображается как свойство Error System.ComponentModel.RunWorkerCompletedEventArgs. Если вы выполняете в отладчике Visual Studio отладчик прерывается в той точке обработчика событий DoWork, где возникло необработанное исключение. "
Однако я столкнулся со странным сбоем.
В моем компоненте есть экземпляр BackgroundWorker.
Даже если он не запущен в отладчике, исключение остается необработанным работником.
Даже упрощенный код создает необработанное исключение (а RunWorkerCompleted не запускается):
Throw New ArgumentException("Test")
Главное - это код RunWorkerComplete:
RaiseEvent UpdateComplete(Me, New AsyncCompletedEventArgs(e.Error, e.Cancelled, e.Result))
Мне нужен компонент для предоставления исключения работника через публичное событие.
Если я удаляю вызов RaiseEvent, исключение становится обработчиком работника и доступно через e.Error.
По-видимому, возбуждение события заставляет работника пропустить исключение. Как это может быть?
Полный код:
Компонент:
Private Sub workerDownloader_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
RaiseEvent UpdateComplete(Me, New AsyncCompletedEventArgs(e.Error, e.Cancelled, e.Result))
End Sub
Private Sub workerDownloader_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
Throw New ArgumentException("Test")
End Sub
Хост-приложение (WinForms):
Private Sub Connector1_UpdateComplete(ByVal sender As System.Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles Connector1.UpdateComplete
If e.Error IsNot Nothing Then MessageBox.Show(e.Error.ToString)
End Sub