WPF - 使用异步命令使用BackgroundWorker进行错误处理
问题描述:
我正在使用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
方法抛出的异常被抓住并为RunWorkerCompletedEventArgs的Error
属性进行设置,对我来说,我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
处理。我如何实现这一目标?
答
Arrgh,没关系,它的Visual Studio做的东西对我来说:
如果操作引发你的代码不处理异常,BackgroundWorker的捕捉异常,并将其传递到RunWorkerCompleted事件处理程序,它作为System.ComponentModel.RunWorkerCompletedEventArgs的Error属性公开。如果您正在Visual Studio调试器下运行,则调试器将在引发未处理的异常的DoWork事件处理程序中断开。
- BackgroundWorker.DoWork Event
我跑我的应用程序在VS调试器