C #의 async
/ await
키워드를 사용하는 비동기 프로그래밍에 대한 몇 가지 모범 사례를 보았습니다 (C # 5.0을 처음 사용했습니다).
주어진 조언 중 하나는 다음과 같습니다.
안정성 : 동기화 컨텍스트 파악
... 일부 동기화 컨텍스트는 재진입이 불가능하고 단일 스레드입니다. 이는 주어진 시간에 하나의 작업 단위 만 컨텍스트에서 실행될 수 있음을 의미합니다. 이에 대한 예는 Windows UI 스레드 또는 ASP.NET 요청 컨텍스트입니다. 이러한 단일 스레드 동기화 컨텍스트에서 교착 상태가되기 쉽습니다. 단일 스레드 컨텍스트에서 작업을 생성 한 다음 컨텍스트에서 해당 작업을 기다리면 대기 코드가 백그라운드 작업을 차단할 수 있습니다.
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
내가 직접 해부하려고하면 메인 스레드가에서 새 스레드로 생성 MyWebService.GetDataAsync();
되지만 메인 스레드가 거기에서 기다리고 있기 때문에 GetDataAsync().Result
. 한편, 데이터가 준비되었다고 가정하십시오. 메인 스레드가 계속 논리를 계속하지 않고 문자열 결과를 반환하는 이유는 GetDataAsync()
무엇입니까?
누군가가 위의 예에서 교착 상태가 발생한 이유를 설명해 주시겠습니까? 나는 문제가 무엇인지에 대해 완전히 단서가 없습니다 ...