WPF - обработка ошибок с помощью асинхронной команды с использованием BackgroundWorker - PullRequest
1 голос
/ 20 октября 2010

Я использую класс AsyncDelegateCommand из этого сообщения в блоге , но мне трудно понять, что делать с исключениями, которые происходят в моем делегате action. Я создаю следующую команду:

new AsyncDelegateCommand(
    readFile, // action to perform
    () => shouldReadFile, // can the action be executed?
    obj => readFileFinished(true), // run after action successfully completed
    ex => readFileFinished(false) // run after action failed
)

Я ожидал, что любые исключения, сгенерированные в моем методе readFile, будут перехвачены, и для свойства Error RunWorkerCompletedEventArgs будет установлен доступ к моему обработчику BackgroundWorker.RunWorkerCompleted. Однако, когда я запускаю свое приложение, я останавливаюсь на одном из исключений, которые выбрасывает readFile, поэтому я никогда не попаду в обработчик для RunWorkerCompleted. Вот мой AsyncDelegateCommand конструктор:

public AsyncDelegateCommand(Action action, Func<bool> canExecute,
    Action<object> completed, Action<Exception> error)
{
    if (null == action)
    {
        throw new ArgumentNullException("action");
    }
    _worker.DoWork += (sender, e) =>
    {
        CommandManager.InvalidateRequerySuggested();
        // This can possibly throw an exception:
        action();
    };
    _worker.RunWorkerCompleted += (sender, e) =>
    {
        if (null != completed && null == e.Error)
        {
            completed(e.Result);
        }
        // I never make it here:
        if (null != error && null != e.Error)
        {
            error(e.Error);
        }
        CommandManager.InvalidateRequerySuggested();
    };
    _canExecute = canExecute;
}

То, что я хотел бы, это для любого исключения, которое action бросает, чтобы быть пойманным и помещенным в Error для обработки в RunWorkerCompleted. Как мне этого добиться?

1 Ответ

1 голос
/ 20 октября 2010

Arrgh, не берите в голову, это Visual Studio делает вещи для меня:

Если операция вызывает исключение, которое ваш код не обрабатывает, BackgroundWorker перехватывает исключение и передает его в обработчик события RunWorkerCompleted, где оно отображается как свойство Error System.ComponentModel.RunWorkerCompletedEventArgs. Если вы работаете в отладчике Visual Studio, он прервется в той точке обработчика событий DoWork, где возникло необработанное исключение.

- Событие BackgroundWorker.DoWork

Я запускал свое приложение с отладчиком в VS.

...