6

이 질문에는 이미 답변이 있습니다.

아래 코드 블록에 교착 상태 차이의 기능, 성능 또는 위험이 있습니까?

예제 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; 


  • 만나다stackoverflow.com/questions/24623120/… - Jaco
  • 결과가 교착 상태를 유발할 수 있습니다. 이 답변을 확인하십시오 :stackoverflow.com/questions/24623120/… - Cody
  • @Cody -이 경우에는 작업이 이미 완료되어 교착 상태가 될 수 없다고 생각합니다. - NStuke
  • @JacodeGroot - Stephen 명확하게 그 질문에 대한 답변이 매우 자세합니다. 링크 덕분입니다. 이 경우 Task.WhenAll ()은 이미 AggregateException을 래핑 해제 했으므로 걱정할 필요가 없습니다. - NStuke

1 답변


6

아래 코드 블록에 교착 상태 차이의 기능, 성능 또는 위험이 있습니까?

아니, 그런 경우는 없다.

두 경우 모두 작업이 완료 될 때 완료됩니다.task1task2완료 될 것이다.

그러므로, 당신이 쓸 때 :

var result1 = await task1; 
var result2 = await task2;

코드가 synchronisyy로 실행됩니다. 너는 할 필요 없어.await너 때문에task1task2완료했을 것이다.

두 번째 예제에서 결과를 얻으려고하는 경우에도 마찬가지입니다.

var result1 = task1.Result;
var result2 = task2.Result; 

작업이 이미 완료되었으므로 스레드를 호출하는 스레드를 차단하거나 컨텍스트 전환 등을하지 않습니다.

최신 정보

이 두 가지 방법간에 존재하는 유일한 기능상의 차이점은 오류 처리가 다르다는 것입니다. 그만큼await그냥AggregateException, 동안.Result예외를 제기 할 것입니다.


  • 기능상의 차이가 있습니다. 오류 처리가 다릅니다.await~을 풀 것이다.AggregateException어디에.Result예외를 그대로 올립니다. - Scott Chamberlain
  • @ScottChamberlain 귀하의 의견에 감사드립니다. 나는 대답에 그것을 포함시킬 것이다. - Christos

연결된 질문


관련된 질문

최근 질문