Task.Result 속성에서 차단된 C# 비동기 작업: 교착 상태 자세한 설명
C#의 async 및 Wait 키워드를 사용한 비동기 프로그래밍은 때때로 혼란스러운 동작을 생성할 수 있습니다. 이 문서에서는 비동기 작업이 Task의 Result 속성에서 중지되는 시나리오를 자세히 설명합니다.
문제 설명
개발자는 비동기 방식을 사용하여 데이터를 검색하는 기존 3계층 애플리케이션에서 이 문제에 직면했습니다. ExecuteAsync
메소드는 스레드 풀 스레드에서 SQL 작업을 시작하고, 후속 메소드 GetTotalAsync
는 대기를 사용하여 결과에 액세스합니다. 그러나 UI 메서드가 비동기 작업의 Result 속성에 액세스하면 애플리케이션이 정지됩니다.
근본 원인: 교착 상태
문제의 근본 원인은 TPL(작업 병렬 라이브러리)을 사용할 때 발생하는 일반적인 오류에 있습니다. 기본적으로 런타임은 원래 메서드를 시작한 것과 동일한 동기화 컨텍스트에서 함수의 연속을 예약합니다. 대부분의 경우 이 동작은 이상적입니다. 그러나 작업이 UI 스레드에서 시작된 후 Result 호출에 의해 차단되면 교착 상태가 발생할 수 있습니다.
솔루션
교착상태를 해결하기 위해서는 여러 가지 방법이 있습니다.
.ConfigureAwait(false)
을 추가하면 호출 컨텍스트에 관계없이 항상 스레드 풀에서 연속이 예약됩니다. 기타 참고사항
위 내용은 작업의 결과 속성에 액세스할 때 비동기 C# 작업이 중단되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!