【发布时间】:2012-02-16 09:57:52
【问题描述】:
我在使用 .Net 4 类 System.Threading.Tasks 时遇到了一些奇怪的行为。这个例子最好地证明了这一点:
var t = FunctionThatReturnsTaskAsync();
Trace.TraceInformation("Completed: " + t.IsCompleted);
return t.Result;
输出:“Completed: true”,但代码(几千次运行一次)然后永远阻塞在 t.Result。它既不返回也不抛出异常。这怎么可能!
返回的任务完成起来要快一些,所以它可以在第二行完成也就不足为奇了。奥秘在于为什么 t.Result 会阻塞。
【问题讨论】:
-
该功能是如何实现的?
-
奇怪。您能否发布一个展示该问题的最小示例?
-
@CodeInChaos,最小的例子就可以了,但由于这种情况发生在“几千次运行中”,我不确定它是否可能。
-
@svick 这样的示例会在循环中调用此代码一百万次,因此很可能会出现问题。
-
Task 类没有 Result 属性。 Start() 方法调用是完全不可见的。发布可以实际重现问题的代码。
标签: c# .net concurrency