首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >未通过等待任务或访问其异常属性来观察到任务的异常。因此,未观察到的异常是

未通过等待任务或访问其异常属性来观察到任务的异常。因此,未观察到的异常是
EN

Stack Overflow用户
提问于 2011-10-25 07:16:57
回答 2查看 54.2K关注 0票数 107

这意味着什么以及如何解决它?

我正在使用TPL任务。

整个错误

通过等待任务或访问其异常属性,未观察到任务的异常。因此,未观察到的异常被终结器线程重新抛出。

在System.Threading.Tasks.TaskExceptionHolder.Finalize()

mscorlib

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-25 07:21:02

如果您创建了一个任务,并且您从未调用过task.Wait()或尝试检索Task<T>的结果,那么当垃圾收集器收集该任务时,它将在完成期间销毁您的应用程序。有关详细信息,请参阅Exception Handling in the TPL上的MSDN页面。

这里最好的选择是“处理”异常。这可以通过延续来完成--你可以给任务附加一个延续,并记录/吞咽/等等发生的异常。这提供了一种清晰的方法来记录任务异常,并且可以编写为一个简单的扩展方法,即:

public static void LogExceptions(this Task task)
{
    task.ContinueWith( t =>
    {
         var aggException = t.Exception.Flatten();
         foreach(var exception in aggException.InnerExceptions)
             LogException(exception);
    }, 
    TaskContinuationOptions.OnlyOnFaulted);
}

有了上面的功能,你就可以通过以下方式防止任何任务破坏应用程序并记录它:

Task.Factory.StartNew( () => 
   { 
       // Do your work...
   }).LogExceptions();

或者,您可以订阅TaskScheduler.UnobservedTaskException并在那里处理它。

票数 164
EN

Stack Overflow用户

发布于 2011-10-25 07:21:33

当然;这意味着Task在被遗留给垃圾收集之后被完成了,但是任务本身失败了。有两种修复方法:

  • 直接处理失败的任务(使用ContinueWith(...)订阅,在parameter)
  • handle .Exception事件中检查Task上的.IsFaulted.Exception,并将其标记为观察到(记录错误后调用e.SetObserved() )
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7883052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档