2016-08-22 102 views
1

我遇到了Task,我用ContinueWith就有问题。在回调中,当第一个任务出现故障时,我没有观察/处理Exception。我发现在这种情况下,这里发生了什么:
Proper way to use .ContinueWith for Tasks谁默认等待任务?

请记住,如果你自己延续不遵守 例外,是谁在这个总体工作流程等待 完整的人是怎么回事成为一个观察它的人。

这让我纳闷:
谁是不是等待一个Task的服务员?
谁默认等待Task

例如:

public int HowOldAmI() 
{ 
    Task t = Task.Run(async() => { 
      await Task.Delay(5000); 
      throw new Exception("Something happened"); 
    }); 
    return 42; 
} 

在这种情况下,谁等待的Task

+3

没有什么,在情况下,你已经证明。没有“隐含地”等待任务完成 - 如果您选择创建任务而不等待它,则任何异常都会转到未查看的异常处理程序。 –

+0

好的,谢谢@JonSkeet。 _unobserved异常处理程序_记录在某处?我问的原因是我的崩溃报告库正在捕获这些异常,虽然没有真正的崩溃发生,所以我试图正确处理异常,以便它们不会出现在我的崩溃报告中。 –

+1

请参阅Andrew的答案... –

回答

2

什么都没有在等待那些没有被任何东西等待的任务。这就是为什么等待它们很重要,否则所有这些异常都将被吞噬,您可能不知道该程序在其中存在逻辑错误。早期版本的.NET具有不同的逻辑并导致进程在未发现异常的情况下崩溃。

还有一个事件可以帮助未观察到的异常(例如,让它们至少在某处登录):TaskScheduler.UnobservedTaskException

又见这个问题的讨论:Unobserved Task exceptions in .NET 4.5 still crash app

+0

好的,谢谢。所以,即使我用't.ContinueWith((previousTask)=> {/ *不遵守Exception * /}的代码继续我的第一个'Task t'),_UnobservedTaskException_处理程序也会被调用;'? –

+1

是的,确切地说。您需要访问任务的“结果”或“异常”属性,或等待其结果异常为“已观察”。否则,它将通过该事件。 –