2012-06-18 2 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.Result1 될 것입니다) 작동, 당신은 Main로 또는 Bar 방법에 넣어합니다. Wait -ing은 정적 생성자에 넣을 때만 멈 춥니 다. 왜냐하면 "any operation that blocks the current thread in a static constructor potentially risks a deadlock"이기 때문입니다.

정적 ctors를 여러 번 동시에 실행하지 못하도록 CLR은 정적 키를 잠금으로 실행합니다. 여기서 Foo의 익명 메소드를 호출하여 Foo의 정적 ctor에서 교착 상태가 발생하기를 기다립니다.

관련 SO 페이지 : 1, 2

+0

그래,이 그것은, 링크 참조 주셔서 감사합니다. –

+0

당신은 환영합니다 :) – kol

관련 문제