.NET Backgroundworker - нет ли способа, чтобы исключения нормально передавались в основной поток? - PullRequest
6 голосов
/ 29 марта 2010

ВОПРОС: При повторном использовании .NET Backgroundworker, нет ли способа, чтобы исключения нормально передавались в основной поток?

ФОН:

  • В настоящее время в моем приложении WinForms у меня есть общий дескриптор исключений, который выглядит следующим образом: (а) пользовательское исключение приложения затем представляется пользователю, но не выходит из программы, и (b) если другое исключение затем присутствует затем выйдите из приложения
  • Приведенное выше замечательно, поскольку я могу просто сгенерировать соответствующее исключение в любом месте приложения, и представление / обработка обрабатываются в общем

Ответы [ 4 ]

6 голосов
/ 29 марта 2010

BackgroundWorker автоматически передает исключение. Он находится в свойстве AsyncCompletedEventArgs.Error , когда вы перехватываете событие RunWorkerCompleted.

Если хотите, вы можете обернуть и перебросить исключение в этом обработчике событий, имея в виду, что в фреймворке есть ошибка , которая будет вызывать «внешнее» исключение вместо в середине Invoke.

Исключением, которое возникает в фоновом потоке в приложении .NET, является катастрофическая ошибка, которая может привести к остановке всего процесса; единственный способ справиться с этим - заключить все действия в блок try-catch и сохранить любое возникшее исключение, что и делает BackgroundWorker.

2 голосов
/ 29 марта 2010

Если асинхронный метод, вызванный 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 перед доступом любые свойства в классе, производном от AsyncCompletedEventArgs; иначе, собственность поднимет TargetInvocationException с его InnerException свойство, содержащее ссылка на ошибку.

1 голос
/ 29 марта 2010

Нет, нет.

Вместо этого вы можете создать класс, который наследует BackgroundWorker и переопределяет OnRunWorkerCompleted, чтобы проверить e.Error и запустить обработчик исключения, если он не null.

0 голосов
/ 29 марта 2010

Вы пробовали статическое Application.ThreadException событие?

...