1

此代码无限期地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

4

1 回答 1

4

如果您将代码的“ StartNew-and- Wait”部分放入或放入方法中,则代码的“-and-”部分将按预期工作( t.Resultwill be )。仅当您将其放入静态构造函数时,它才不会停止,因为“在静态构造函数中阻塞当前线程的任何操作都可能存在死锁风险”。1MainBarWait

为了防止同时多次执行静态ctor,CLR 在锁下执行它们。在这里,您尝试从 Foo 的静态 ctor 调用 Foo 的匿名方法,并等待它完成,这会导致死锁。

相关 SO 页面:1 , 2

于 2012-06-18T17:38:38.407 回答