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)
我也没有在文档IsFaulted或Exception属性中看到任何相关的评论.
为什么var ignored = t.Exception; // don't remove!在这种情况下需要这一行?
一个相关的问题:我认为在发布模式下这些行已被优化,但鉴于此处的注释和意图并非如此(如果代码是正确的).那么为什么这条线保持在发布模式?
该行是观察到的异常与未观察到的异常之间的差异.
在.Net 4.0中,具有未观察到的异常的任务将抛出UnobservedTaskException并拆除整个应用程序:
"如果您不等待传播异常的任务或访问其Exception属性,则在对任务进行垃圾回收时,将根据.NET异常策略升级异常."
async-await虽然你可以使用app.config(<ThrowUnobservedTaskExceptions enabled="true"/>)获得旧的行为,但在.Net 4.5中已经改变了.
还有一个event(TaskScheduler.UnobservedTaskException)允许您在应用程序崩溃之前处理此类错误任务.该事件仍在.Net 4.5及以上版本中提出.