我正在阅读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;
}
我也没有在文档中看到有关
IsFaulted
或Exception
属性的任何相关说明。为什么在这种情况下需要此行
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/