2017-02-15 6 views
5

의 내가 비슷한 즉시 다른 비동기 메서드를 호출하는 방법 또는 있다고 가정 해 봅시다 :통과 비동기 메서드는 실제로 대기/비동기 패턴이 필요합니까?

//Main method 
public async Task<int> Foo1(int x) 
{ 
    var result = await DoingSomethingAsync(x); 
    return DoSomethingElse(result); 
} 
//other method 
public async Task<int> Foo2(Double double) 
{ 
    return await Foo1(Convert.ToInt32(double)); 
} 

Foo2 필요가 /이 것을 어떤 특별한 이유가를 비동기/await를 단순히 호출 반대로 :

//other method 
public Task<int> Foo3(Double double) 
{ 
    return Foo1(Convert.ToInt32(double)); 
} 

int x = await Foo1(1); 
int x = await Foo2(1D); 
int x = await Foo3(1D); 

그 모든 진술한다 : 소비자에

이 여전히 관계없이, likeso, 기다려온 것 엮다. 컴파일러가 서로 다른 두 가지 방법에 대해 서로 다른 IL을 생성합니까?

답변

6

에 따라 다릅니다. 특히 Convert.ToInt32이 throw되는 경우 예외 동작이 다릅니다.

나는 전체 blog post on the subject을 가지고 있지만 요약하면 반환 된 작업에 예외가 적용될 것이므로 async/await을 여기에서 사용합니다. 그렇지 않으면 예외가 직접 발생합니다.

예외 예외는 직접 전제 조건 예외 (즉, int로 변환 할 수없는 double을 전달하는 API 위반)에 대해서만 허용됩니다. 그런 다음 (사전 조건 예외의 경우) 예외를 직접 throw하거나 반환 된 작업에 배치 할 수 있습니다.