C#任务 - 为什么在这种情况下需要noop线

V.B*_*.B. 11 .net c# task-parallel-library

我正在阅读Interactive Extensions的源代码,并找到了一条我无法理解的行:

public static Task<bool> UsingEnumerator(this Task<bool> task, IDisposable disposable)
{
    task.ContinueWith(t =>
    {
        if (t.IsFaulted)
        {
            var ignored = t.Exception; // don't remove!
        }

        if (t.IsFaulted || t.IsCanceled || !t.Result)
            disposable.Dispose();
    }, TaskContinuationOptions.ExecuteSynchronously);

    return task;
}
Run Code Online (Sandbox Code Playgroud)

我也没有在文档IsFaultedException属性中看到任何相关的评论.

为什么var ignored = t.Exception; // don't remove!在这种情况下需要这一行?

一个相关的问题:我认为在发布模式下这些行已被优化,但鉴于此处的注释和意图并非如此(如果代码是正确的).那么为什么这条线保持在发布模式?

i3a*_*non 7

该行是观察到的异常与未观察到的异常之间的差异.

在.Net 4.0中,具有未观察到的异常的任务将抛出UnobservedTaskException并拆除整个应用程序:

"如果您不等待传播异常的任务或访问其Exception属性,则在对任务进行垃圾回收时,将根据.NET异常策略升级异常."

异常处理(任务并行库)

async-await虽然你可以使用app.config(<ThrowUnobservedTaskExceptions enabled="true"/>)获得旧的行为,但在.Net 4.5中已经改变了.

还有一个event(TaskScheduler.UnobservedTaskException)允许您在应用程序崩溃之前处理此类错误任务.该事件仍在.Net 4.5及以上版本中提出.