2010-04-16 2 views
4

내가MSDN TPL에서 예외 처리 예제 - 경쟁 조건입니까?

http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx

@ MSDN에서 코드의 기본 형태를 예를 처리 TPL 예외 찾고 있어요입니다

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); 
try 
{ 
    task1.Wait(); 
} 
catch (AggregateException ae) 
{ 
    throw ae.Flatten(); 
} 

내 질문은 :이 경쟁 조건인가? try가 실행되기 전에 task1이 throw되면 어떻게됩니까? 나는 이것이 인종 인 것을 멈추는 무언가를 놓치고 있냐?

은이 대신 같은 기록 안 :

try 
{ 
    Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); 
    task1.Wait(); 
} 
catch (AggregateException ae) 
{ 
    throw ae.Flatten(); 
} 

답변

6

아니, 첫 번째 예는 완벽하게 유효합니다.

작업에서 예외가 발생하면 AggregateException에 래핑됩니다. 다른 스레드가 작업에 조인 할 때만이 예제에서 task1.Wait()을 호출하여 조인 스레드에 전파되는 예외입니다. 본질적으로 예외는 피드백을 기다리고있는 스레드로 다시 전달 될 때까지 '저장'됩니다.