此代码在t.Wait()
行无限期等待。
void Main()
{
Foo.Bar();
}
public static class Foo
{
static Foo()
{
var t = Task.Factory.StartNew (() => 1);
t.Wait();
"Done".Dump();
}
public static void Bar()
{
}
}
我希望任务能够立即运行并完成。有什么想法为什么?在实例构造函数中似乎没有发生这种情况。 v4.42.01
答案 0 :(得分:4)
您的代码中的“StartNew
- 和 - Wait
”部分按预期工作(t.Result
将为1
),如果您将其放入{{1 }或Main
方法。它只会在你将它放入静态构造函数时才会停止Bar
,因为“any operation that blocks the current thread in a static constructor potentially risks a deadlock”。
为了防止同时多次执行静态ctors,CLR在锁定下执行它们。在这里,您尝试调用Foo的匿名方法,并等待它从Foo的静态ctor完成,这会导致死锁。