2010-10-20 43 views
1

我正在使用this blog post中的AsyncDelegateCommand类,但我无法知道如何处理发生在我的action委托中的异常。我创建了下面的命令:WPF - 使用异步命令使用BackgroundWorker进行错误处理

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罚球被捕获并塞进ErrorRunWorkerCompleted处理。我如何实现这一目标?

回答

1

Arrgh,没关系,它的Visual Studio做的东西对我来说:

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

- BackgroundWorker.DoWork Event

我跑我的应用程序在VS调试器