Mas*_*Mas 7 .net .net-4.0 task
我有一个WPF应用程序,我使用System.Threading.Tasks进行长时间运行的WCF调用.我通过向Application.Current.DispatcherUnhandledException添加处理程序来捕获未处理的异常.
我创建了一个任务,其中ContinueWith函数使用以下代码在UI线程上运行:
var task = new Task<T>(func).ContinueWith(t =>
{
if (t.IsFaulted)
{
throw t.Exception.GetBaseException();
}
else
{
// Show t.Result on UI
}
}, TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
当任务中发生异常时,我想重新抛出异常,以便DispatcherUnhandledException处理程序可以处理它.但是当我重新抛出异常时,如上所示,它会崩溃我的应用程序并且不会调用DispatcherUnhandledException.
如何在UI线程上重新抛出异常,以便调用DispatcherUnhandledException处理程序?
当我使用BackgroundWorker时,重新抛出异常就是这样.基本上,我希望用Task替换BackgroundWorker,因为Task有一些我想要利用的非常好的功能.
解决此问题的一种方法是在语句中包含的Lambda表达式中重新抛出Exception.就像是:
Exception ex = t.Exception;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { throw ex; }));
Run Code Online (Sandbox Code Playgroud)
我不建议这虽然有点犯规,但确实回答了这个问题!
您也可以使用SynchronizationContext.Post执行类似于讨厌的操作.
| 归档时间: |
|
| 查看次数: |
2575 次 |
| 最近记录: |