我读互动扩展的源代码,并发现了一个line,我无法理解:C#任务 - 为什么需要在这种情况下,一个空操作线
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!
?
一个相关的问题:我认为这样的代码行在发布模式下被优化了,但是在这里给出的评论和意图并非如此(如果代码是正确的)。那么为什么这条线保持在发布模式?
在.net 4中,如果任务发生故障但其“Exception”属性未被访问,则任务终结器会引发异常。 – Lee
@李先生谢谢!这实际上写在'Exception'属性的文档中,但是我在第一次阅读时并没有理解它。 –
关于它在发布版本中被删除,'ignored'本地将被删除,但't.Exception'将被解析为它的值(因为它可能,并且在这种情况下确实会导致副作用),那只是在发布版本中将返回值放在地板上,而不是存储在未读变量中。 – Servy