.NET 4.0任务:在Task.ContinueWith中对UI线程的Rethrow异常

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有一些我想要利用的非常好的功能.

Ric*_*dOD 7

解决此问题的一种方法是在语句中包含的Lambda表达式中重新抛出Exception.就像是:

Exception ex = t.Exception;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { throw ex; }));
Run Code Online (Sandbox Code Playgroud)

我不建议这虽然有点犯规,但确实回答了这个问题!

您也可以使用SynchronizationContext.Post执行类似于讨厌的操作.