【问题标题】:WPF - error handling with asynchronous command using BackgroundWorkerWPF - 使用 BackgroundWorker 使用异步命令处理错误
【发布时间】:2011-04-28 05:46:44
【问题描述】:

我正在使用来自this blog postAsyncDelegateCommand 类,但我不知道如何处理我的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 方法中抛出的任何异常都会被捕获,并且要设置 RunWorkerCompletedEventArgsError 属性,以便我在我的 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 中处理。我如何做到这一点?

【问题讨论】:

    标签: c# wpf exception asynchronous backgroundworker


    【解决方案1】:

    啊,没关系,这是 Visual Studio 为我做的事情:

    如果操作引发了您的代码未处理的异常,BackgroundWorker 会捕获该异常并将其传递给 RunWorkerCompleted 事件处理程序,在该处理程序中它作为 System.ComponentModel.RunWorkerCompletedEventArgs 的 Error 属性公开。如果您在 Visual Studio 调试器下运行,调试器将在 DoWork 事件处理程序中引发未处理异常的位置中断。

    -- BackgroundWorker.DoWork Event

    我在 VS 中使用调试器运行我的应用程序。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 2013-01-25
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2010-09-14
      • 2016-01-31
      • 2016-03-30
      • 2019-05-13
      相关资源
      最近更新 更多