任务和线程不在Linqpad中的静态构造函数中运行

时间:2012-06-18 16:55:04

标签: c# linqpad static-constructor

此代码在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

1 个答案:

答案 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完成,这会导致死锁。

相关的SO页面:12