ВОПРОС: использование Ре.NET Backgroundworker, там не способ позволить исключениям обычно пасовать назад к основному потоку?
ФОН:
BackgroundWorker
автоматически возвращает исключение. Он находится в свойстве AsyncCompletedEventArgs.Error , когда вы подключаете событие RunWorkerCompleted
.
Если хотите, вы можете обернуть и повторно вызвать исключение в этом обработчике событий - помня, что в структуре есть ошибка , которая вызовет «внешнее» исключение, потому что вы: re в середине Invoke
.
Исключением, которое возникает в фоновом потоке в приложении .NET, является катастрофическая ошибка, которая может и приведет к остановке всего процесса; единственный способ справиться с этим - заключить все действия в блок try-catch и сохранить любое возникшее исключение, что и делает BackgroundWorker
.
Нет, нет.
Вместо этого вы можете создать класс, который наследует BackgroundWorker
и переопределяет OnRunWorkerCompleted
, чтобы проверить e.Error
и запустить обработчик исключений, если он не null
.
Если асинхронный метод, вызываемый DoWork, вызывает исключение, это исключение будет доступно обработчику RunWorkerCompleted. Вы можете справиться с этим там.
private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
...
}
Из MSDN :
Если во время асинхронной операции возникает исключение, класс назначит исключение свойству Error . Делегат обработчика событий клиентского приложения должен проверять свойство Error перед доступом к любым свойствам в классе, производном от AsyncCompletedEventArgs; в противном случае свойство вызовет исключение TargetInvocationException с его свойством InnerException, содержащим ссылку на ошибку.
Вы пробовали использовать статическое событие Application.ThreadException ?