2015-01-22 1 views
2

작업 취소를 처리하기 위해, 나는 모든 코드를 통해 볼 수,이 패턴에 대한 걱정 :일반 접근 방식은 내가 코드 리뷰를하고있어 제대로

try 
{ 
    await DoSomethingAsync(); 
    await DoSomethingElseAsync(); 
    // and so on... 
} 
catch (OperationCanceledException) 
{ 
    // all good, user cancelled 
    // log and return 
    return; 
} 
// handle other particular exceptions 
// ... 
catch (Exception ex) 
{ 
    // fatal error, alert the user 
    FatalErrorMessage(ex); 
} 

내가 OperationCanceledException을 처리에 대한 걱정 부분 . 이 코드도 AggregateException을 처리해야하며 내부가 예외인지 여부는 OperationCanceledException입니까?

저는 Task.Wait 또는 Task.ResultOperationCanceledException이 아닌 AggregateException 인 것을 알고 있습니다. 코드 작성자는 async/await만을 사용하고 결코 Wait/Result을 사용하지 않는다고 확신했습니다. 따라서 그녀는 취소를 위해 AggregateException을 추가적으로 관찰한다는 생각을 좋아하지 않습니다. 그러나 제 요점은 표준 Task 기반 BCL API는 OperationCanceledException을 여전히 AggregateException으로 바꿀 수 있습니다. 여전히 내부적으로 Task.Result에 액세스 할 수 있기 때문입니다.

의미가 있습니까? OperationCanceledExceptionAggregateException을 모두 처리하는 것에 대해 걱정해야합니까?

답변

3

글쎄,이 코드를 확인하기 위해 매우 쉽게하는 기술적 확실히 가능 : 반환 작업 내부

static void Main() 
{ 
    Test().Wait(); 
} 

static async Task Test() 
{ 
    try 
    { 
     await ThrowAggregate(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
} 

static async Task ThrowAggregate() 
{ 
    ThrowException().Wait(); 
} 

static async Task ThrowException() 
{ 
    throw new OperationCanceledException(); 
} 

ThrowAggregate 저장 AggregateException 그렇게 기다리고 여전히 AggregateException가 발생합니다. 그러므로 부지런히되고 싶다면 AggregateException도 잡아야합니다.

그러나, BCL 어떤 방법이 할 것 매우 가능성 을 그리고 그것은 그렇게한다면 당신은 당신의 동기화를 통해 비동기하고 있기 때문에 예외 처리보다 더 큰 문제가있다. 나는 당신 자신의 코드에 대해 더 걱정할 것이다.

+0

@arnon 감사합니다. 합리적인 것 같아서 잠시 후 답변으로 받아 들일 것입니다. – avo

+0

@avo 환영합니다 :) – i3arnon

4

그러나 필자의 요점은 작업 기반 BCL API가 여전히 AggregateException으로 OperationCanceledException을 래핑 할 수 있다는 것입니다. 여전히 내부적으로 Task.Result에 액세스하고 있기 때문입니다.

아니요, 그들은 그렇게하지 않습니다.

OperationCanceledException 및 AggregateException을 모두 처리하여 취소를 올바르게 관찰해야합니까?

아니요. 물론 가능함AggregateException에는 OperationCanceledException이 포함될 수 있지만 쉽게 마찬가지로 other particular exceptions을 포함 할 수 있습니다.

비동기 모범 사례 (예 : 비 동기화 또는 동기화 비 동기화)를 따르는 한 걱정할 필요가 없습니다.

관련 문제