2012-06-18 3 views
1

Этот код ожидает неопределенно долгое время на линии t.Wait().Задачи и потоки не выполняются внутри статических конструкторов в Linqpad.

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

«StartNew -и- Wait» часть кода работает, как ожидалось (t.Result будет 1), если положить его в Main или в метод Bar. Он не останавливается Wait-только, если вы поместите его в статический конструктор, потому что «any operation that blocks the current thread in a static constructor potentially risks a deadlock».

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

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

+0

Да, это он, спасибо за ссылки на ссылки. –

+0

Добро пожаловать :) – kol