C#의 비동기/차단에서 교착 상태를 이해하고 방지합니다
c#'s /는 비동기 프로그래밍을 단순화하지만 부적절한 사용은 교착 상태로 이어질 수 있습니다. 일반적인 시나리오를 살펴 보겠습니다
교착 상태 :
async
가 를 사용하여 완료하기 때문에 발생하기 때문에 발생합니다. await
는 일반적으로 스레드를 출시하지만
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>는 기본 스레드의 맥락에서 실행됩니다. 그것이
일 때, 그것은 컨텍스트를 포착하고 재개를 기다립니다. 그러나 메인 스레드가 차단되어 가 마무리되는 것을 방지합니다. 이것은 고전적인 교착 상태입니다. 메인 스레드는 를 기다립니다.이 스레드는 메인 스레드가 컨텍스트를 공개하기를 기다립니다. 교착 상태 예방 :
ActionAsync
방법 내에서 GetDataAsync
.Result in
위 내용은 C#에서 Async/Await 교착 상태가 어떻게 발생할 수 있으며 어떻게 방지 할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!