await
및 Task.Result
비교: 모범 사례
"C#의 동시성 요리책"에서는 완료된 작업을 처리하는 패턴을 보여줍니다.
<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask;</code>
이 코드는 Task.WhenAny
을 사용하여 downloadTask
(httpclient.GetStringAsync
작업) 전에 timeoutTask
(Task.Delay
호출)이 완료되는지 여부를 결정합니다.
단순히 await downloadTask
을 반환하는 대신 downloadTask.Result
을 사용하는 이유는 무엇입니까? 중요한 이유는 다음과 같습니다.
예외 처리:
await
은 AggregateException
의 복잡성을 피합니다. Task.Result
또는 Task.Wait()
AggregateException
내에 예외를 래핑하여 근본 원인을 모호하게 만듭니다. 비동기 코드는 이상적으로 예외를 직접 처리하여 await
더 깔끔한 솔루션교착 상태 방지:
Task.Result
또는 Task.Wait()
을 사용하면 교착 상태가 발생할 수 있습니다. await
은 비동기 컨텍스트용으로 설계되었으며 이러한 일반적인 함정을 방지합니다.모범 사례 요약:
await
를 선호합니다.Task.Result
또는 Task.Wait()
는 유틸리티 코드에서 허용될 수 있지만(이유를 설명하는 명확한 설명 포함) 일반적으로 사용하지 않는 것이 가장 좋습니다.Task.Result
및 Task.Wait()
는 동기 차단이 허용되고 이해되는 병렬 작업 시나리오에 고려될 수 있습니다.위 내용은 완료된 작업에 대해 언제 `Task.Result` 대신 `await`를 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!