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」部分は、またはメソッドに入れると、期待どおりに機能します (t.Resultになります) 。「静的コンストラクターで現在のスレッドをブロックする操作は、潜在的にデッドロックのリスクがあるため」、静的コンストラクターに配置した場合にのみ停止しません。1MainBarWait

静的 ctor が同時に複数回実行されるのを防ぐために、CLR はそれらをロック下で実行します。ここでは、Foo の静的 ctor から Foo の匿名メソッドを呼び出そうとし、それが終了するのを待ちます。これにより、デッドロックが発生します。

関連 SO ページ: 1 , 2

于 2012-06-18T17:38:38.407 に答える