11

작업 내에서 발생하는 예외를 관찰하는 데는 여러 가지 방법이 있습니다.ContinueWith 내에서 작업 예외 관찰

var task = Task.Factory.StartNew(() => 
{ 
    // Throws an exception 
    // (possibly from within another task spawned from within this task) 
}); 

var failureTask = task.ContinueWith((t) => 
{ 
    // Flatten and loop (since there could have been multiple tasks) 
    foreach (var ex in t.Exception.Flatten().InnerExceptions) 
     Console.WriteLine(ex.Message); 
}, TaskContinuationOptions.OnlyOnFaulted); 

내 질문 : failureTask가 시작되면 예외가 자동으로 관찰 될 수 있나요 아니면 단지 내가 '터치'ex.Message 번 관찰 될 수 있나요 그 중 하나는 OnlyOnFaulted와 ContinueWith에?

+1

당신이 무엇을 의미합니까? ContinueWith 대리자는 예외 개체에 액세스하는지 여부에 관계없이 한 번만 호출됩니다. –

+0

아마도 "t.Exceptions'에 액세스하지 않고 단순히 'OnlyOnFaulted'를 호출하면 예외가 다시 발생합니까? – user7116

+0

Tasks에서 Throw 된 예외 ("Microsoft 용어")를 "관찰"하지 않으면 가비지 수집기에서 나중에 예외를 throw합니다. 내 ContinueWith 대리자가 반드시 여러 번 호출 될 수 있습니다 (주 작업 내에서 여러 작업이 예외를 throw하는 경우) ... 또는 모든 예외가 발생한 AggregateException 트리가 호출 될 수 있습니까? – davenewza

답변

10

Exception 속성에 액세스하면 으로 표시됩니다.

도 참조하십시오. AggregateException.Handle. 대신 t.Exception.Handle를 사용할 수 있습니다

t.Exception.Handle(exception => 
      { 
      Console.WriteLine(exception); 
      return true; 
      } 
    ); 
+0

감사합니다. 작업 예외를 처리하는 데는 여러 가지 방법이있는 것 같습니다. – davenewza

+1

그래, 나는 다소 Handle 메서드를 선호한다. 왜냐하면 그것은 더 명백하기 때문입니다. 그러나 모든 상황에서 사용할 수는 없습니다. –

2

샘플 관찰에 의해

Task.Factory.StartNew(testMethod).ContinueWith(p => 
      { 
       if (p.Exception != null) 
        p.Exception.Handle(x => 
         { 
          Console.WriteLine(x.Message); 
          return false; 
         }); 
      }); 
+2

여기에 Handle() 함수에 전달 된 조건자를 처리하면 예외를 표시하려면 true를 반환하지 않아야합니까? 나는 당신이 원하는 것에 달려 있다고 생각하지만 여기서는 예외를 처리 된 것으로 표시하려고합니다. –

관련 문제