.NET Backgroundworker - Там никакой путь не состоит в том, чтобы позволить исключениям обычно пасовать назад к основному потоку?

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

ФОН:

  • В настоящее время в моем приложении WinForms у меня есть универсальный дескриптор исключения, который идет вроде, если (a) исключение пользовательского приложения затем представляет пользователю, но не выходит из программы и (b) если другое исключение затем представляет и затем выходит из приложения
  • Вышеупомянутое хорошо, поскольку я могу просто выдать соответствующее исключение где угодно в приложении, и презентация/обработка обрабатывается в общем
6
задан Greg 29 March 2010 в 00:16
поделиться

4 ответа

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

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

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

6
ответ дан 10 December 2019 в 02:45
поделиться

Нет, нет.

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

1
ответ дан 10 December 2019 в 02:45
поделиться

Если асинхронный метод, вызываемый 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, содержащим ссылку на ошибку.

2
ответ дан 10 December 2019 в 02:45
поделиться

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

0
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: