gpt4 book ai didi

.NET 4.0 任务 : Rethrow Exception to UI Thread in Task. 继续

转载 作者:行者123 更新时间:2023-12-02 17:45:22 26 4
gpt4 key购买 nike

我有一个 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());

当任务中发生异常时,我想重新抛出异常,以便 DispatcherUnhandledException 处理程序可以处理它。但是,当我重新抛出异常时,如上所示,它会使我的应用程序崩溃,并且不会调用 DispatcherUnhandledException。

如何在 UI 线程上重新引发异常,以便调用 DispatcherUnhandledException 处理程序?

当我使用BackgroundWorker时,重新抛出异常正是这样做的。基本上,我希望用 Task 替换 BackgroundWorker,因为 Task 有一些我想利用的非常好的功能。

最佳答案

解决此问题的一种方法是在语句中包含的 Lambda 表达式中重新抛出异常。像这样的东西:

Exception ex = t.Exception;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { throw ex; }));

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

您也可以使用 SynchronizationContext.Post 做一些类似的令人讨厌的事情。 .

关于.NET 4.0 任务 : Rethrow Exception to UI Thread in Task. 继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6942495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com