Задачи и потоки не запускаются в статических конструкторах в Linqpad

Этот код бесконечно ожидает в строке 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


person Marty Neal    schedule 18.06.2012    source источник


Ответы (1)


Часть "StartNew-и-Wait" вашего кода работает, как и ожидалось (t.Result будет 1), если вы поместите ее в метод Main или в метод Bar. Он не останавливает Wait только в том случае, если вы поместите его в статический конструктор, потому что "любая операция, которая блокирует текущий поток в статическом конструкторе, потенциально может привести к взаимоблокировке".

Чтобы предотвратить одновременное выполнение статических векторов несколько раз, CLR выполняет их с блокировкой. Здесь вы пытаетесь вызвать анонимный метод Foo и ждете его завершения из статического ctor Foo, что вызывает взаимоблокировку.

Связанные страницы SO: 1, 2

person kol    schedule 18.06.2012