2014-10-08 5 views
2

아주 간단한 예를 들어 봅시다.IQueryable <T> 및 async/await

var sublist = Task.WhenAll(list.Select(x => x.getYAsync())); 

이 : 다음이 사이의 차이점은 무엇입니까 두 경우 모두

var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync())); 

sublist의 유형은 동일합니다, 그래서 유일한 차이는 의미입니다. 그 중 하나는 다른 것보다 잘 수행됩니까? 다른 것보다 하나 더 표준인가?

답변

3

유일한 차이점은 예외 전파입니다.

getYAsync 반환 된 작업에 저장되지 않은 예외가 발생하는 경우 * 두 번째 옵션은 예외가 때를 던져 질 것이다 Task.WhenAll에서 반환 된 작업에 저장했을 때 Task.WhenAll를 호출 할 때 예외가있을 것 첫 번째 옵션 과제가 기다리고 있습니다.

이외에 약간의 (매우 작은) 오버 헤드를 가진 async 람다에 상태 머신이 내장되어 있습니다.

첫 번째 옵션은 약간 작은을 수행하지만 두 번째 옵션은 다른 것보다 표준입니다. 더 안전한 옵션은 명시 적으로 asyncawait을 나타내지 만 간단한 경우에는 다소 중복됩니다. 예를 들어

* : Task getYAsync() { throw new Exception(); return Task.Delay(1)}