비동기 프로그래밍 : 및 잠재적 인 데드 잠금 장치 비교
과 의 차이는 혼란 스러울 수 있습니다. 이를 설명하려면 ASP.NET WebApi 서비스의 장면을 살펴 보겠습니다 : .
await
이 장면에서 "get"메소드에는 교착 상태가있을 것으로 예상됩니다. 근본적인 이유는 무엇입니까? Task.WaitAll
보다는 장애물 사용과 대기의 차이점은 무엇입니까?
차이점 : 및
Task.Wait
await
는 비슷한 개념적 역할을 가정하지만 그 기능은 다릅니다. public async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray()); return new string[] { "value1", "value2" }; // 由于死锁而从未执行 }
잠재적 인 죽은 자물쇠와 비동기 임무
호출에서 스레드가 여전히 차단되었습니다. 이로 인해 죽은 자물쇠가 발생합니다.
데드 잠금 장치를 피하기 위해 비동기 프로그래밍을 사용하십시오 Wait
await
이 문제를 해결하려면 특히 지연 및 서스펜션 작업을 처리 할 때 비동기 프로그래밍을 사용해야합니다. 및 키워드의 사용을 결합함으로써 코드는 응답 능력을 유지하고 데드 잠금을 방지 할 수 있습니다.
위 내용은 비동기 프로그래밍 :`task.waitall` 교착 상태 :`await '사용과 어떻게 다른 것은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!