async
메서드에서 을 호출하면 교착 상태가 발생할 수 있다는 것을 알고 있습니다. 그래도 질문에 다른 비틀어 짐.작업 완료를 알면 비동기 메서드로 task.Result를 호출해도 괜찮습니까?
나는이 패턴을 많이하고 있음을 알았다. 같은 유형의 결과를 반환하는 여러 가지 작업이 있으므로 한 번에 모두 기다릴 수 있습니다. 그래도, 개별적으로 결과를 처리 할 :
Task<int> t1 = m1Async();
Task<int> t2 = m2Async();
await Task.WhenAll(t1, t2);
그것이 내가 알고 있기 때문에 작업이 현재 완료, 여기 Result
전화를 확인인가? 난 아직도 await
를 사용해야합니다
int result1 = t1.Result;
int result2 = t2.Result;
또는은 ... 그냥 중복 보인다 나는 결과를 처리 할 방법에 따라 약간의 추악한 될 수 있습니다
int result1 = await t1;
int result2 = await t2;
업데이트 : 누군가가 내 질문을 표시 이 사본으로 복제본 : Awaiting multiple Tasks with different results. 질문이 다르므로 내 검색에서 찾지 못했습니다. 거기에 대한 자세한 대답 중 하나가 질문 할 수도 있습니다.
네, 알고 있다면 Result를 호출해도됩니다. 그러나 WhenAll과 t1 또는 t2가 예외를 던진 후에 .Result를 호출하면 .Result가 문제가 될 수 있습니다. –
예외가있는 다른 동작을 나타내는 게시물을 보았습니다.하지만이 모든 것을 이해하려면 좀 더 자세히 조사해야합니다. 빠른 응답에 감사드립니다! – Cary
알아 두어야 할 것이 하나 있습니다. 이미 완료된 상태의 작업에'await'을 호출하면 성능 오버 헤드가 0입니다. 상태 머신은 생성 된 상태를 검사하고 기본적으로'.Result'를 내부적으로 호출하는 것으로 건너 뜁니다. (실제로'.GetAwaiter(). GetResult()'를 호출하지만,'.Result'를 호출하는 것과 동일한 오버 헤드를가집니다.). 그래서 나에게 이미'async'라고 표시된 메소드 안에서'.Result'를 사용하는 강력한 이유는 없습니다. –