我正在阅读Interactive Extensions的源代码,并且发现了我不理解的line:

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;
}

我也没有在文档中看到有关IsFaultedException属性的任何相关说明。

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

一个相关的问题:我认为这样的行在Release模式下已被优化,但是这里给出的注释和意图不是这种情况(如果代码正确)。那么,为什么此行保持在“发布”模式下?

最佳答案

该行是(观察到的异常)与未观察到的异常之间的区别。

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



Exception Handling (Task Parallel Library)

在.Net 4.5中使用async-await进行了更改,尽管您可以使用app.config(<ThrowUnobservedTaskExceptions enabled="true"/>)恢复旧的行为。

还有一个事件(TaskScheduler.UnobservedTaskException),可让您在应用程序崩溃之前处理此类错误的任务。该事件仍在.Net 4.5及更高版本中引发。

关于C#任务-为什么在这种情况下需要noop行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30264894/

10-11 07:28