3

작업 계속 어딘가에 던져진 예외를 처리하는 가장 좋은 방법은 무엇입니까?작업 계속 어딘가에서 처리 된 핸들 예외

예를 들어, 아래에 간단한 작업 연속 (updateMessages ->updateInterface)이 있지만 실제로는 두 개 이상의 작업 체인 일 수 있습니다. 나는 체인에서 발생할 수있는 모든 결함에서 계속되는 일반적인 예외 "catch all"태스크를 원합니다.

내가 이것을 수행하는 방법은 Action (예외를 관찰하고 기록)을 정의하고 각 작업을 TaskContinuationOptions.OnlyOnFaulted으로 설정하는 것입니다. 아마도 이것을하는 더 좋은 방법이 있을까요?

Task updateMessages = Task.Factory.StartNew(() => 
{ 
    // Do stuff 
}); 

Task updateInterface = updateMessages.ContinueWith(task => 
    { 
    // UI updates 
    }, 
    System.Threading.CancellationToken.None, 
    TaskContinuationOptions.NotOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext()); 

Action<Task> failureAction = new Action<Task>(failedTask => 
{ 
    // Observe and log exceptions 
}); 

updateMessages.ContinueWith(failureAction, CancellationToken.None, 
          TaskContinuationOptions.OnlyOnFaulted, 
          TaskScheduler.FromCurrentSynchronizationContext()); 
updateInterface.ContinueWith(failureAction, CancellationToken.None,   
          TaskContinuationOptions.OnlyOnFaulted, 
          TaskScheduler.FromCurrentSynchronizationContext()); 

답변

3

귀하의 접근 방식은 내가 사용하는 방법이며 잘 작동합니다.

질문에 대해없는 잡담 몇 :

  • 당신의 failureAction 정말 메인 UI 스레드에서 실행해야합니까?
  • 모든 작업에서이 작업을 수행 할 예정이므로 실패 지속을 첨부하는 도우미 메서드를 작성합니다.
+0

일부 컨트롤 업데이트가 필요하지 않으면 UI 스레드에있을 필요는 없습니다. 도우미 방법은 좋은 생각입니다. 감사합니다 :) – davenewza

+1

위대한. 그 경우, 나는 그것이 항상 UI 스레드 (그 추가 비용) 이후 예약되지 말고, 오히려, 컨트롤이 컨트롤을 업데이 트 해야하는 경우, 그 컨트롤을 사용하여 호출합니다. (우리는 어쨌든 결함의 경우에 대해서만 이야기하고 있기 때문에 사소한 부분입니다.) –