이 질문에는 이미 답변이 있습니다.
아래 코드 블록에 교착 상태 차이의 기능, 성능 또는 위험이 있습니까?
예제 1 :
await Task.WhenAll(task1, task2);
var result1 = await task1;
var result2 = await task2;
예 2 :
await Task.WhenAll(task1, task2);
var result1 = task1.Result;
var result2 = task2.Result;
아래 코드 블록에 교착 상태 차이의 기능, 성능 또는 위험이 있습니까?
아니, 그런 경우는 없다.
두 경우 모두 작업이 완료 될 때 완료됩니다.task1
과task2
완료 될 것이다.
그러므로, 당신이 쓸 때 :
var result1 = await task1;
var result2 = await task2;
코드가 synchronisyy로 실행됩니다. 너는 할 필요 없어.await
너 때문에task1
과task2
완료했을 것이다.
두 번째 예제에서 결과를 얻으려고하는 경우에도 마찬가지입니다.
var result1 = task1.Result;
var result2 = task2.Result;
작업이 이미 완료되었으므로 스레드를 호출하는 스레드를 차단하거나 컨텍스트 전환 등을하지 않습니다.
최신 정보
이 두 가지 방법간에 존재하는 유일한 기능상의 차이점은 오류 처리가 다르다는 것입니다. 그만큼await
그냥AggregateException
, 동안.Result
예외를 제기 할 것입니다.
await
~을 풀 것이다.AggregateException
어디에.Result
예외를 그대로 올립니다. - Scott Chamberlain