이 비동기 / 대기 코드가 교착 상태를 일으키지 않는 이유는 무엇입니까?

Yeldar Kurmangaliyev

Jon Skeet의 "C # in depth. 3rd edition"에서 다음 예제를 찾았습니다.

static async Task<int> GetPageLengthAsync(string url)
{
    using (HttpClient client = new HttpClient())
    {
        Task<string> fetchTextTask = client.GetStringAsync(url);
        int length = (await fetchTextTask).Length;
        return length;
    }
}

public static void Main()
{
    Task<int> lengthTask = GetPageLengthAsync("http://csharpindepth.com");
    Console.WriteLine(lengthTask.Result);
}

이 코드가 교착 상태가 될 것으로 예상했지만 그렇지 않습니다.

내가보기에 다음과 같이 작동합니다.

  1. Main메서드 GetPageLengthAsync는 메인 스레드 내에서 동 기적으로 호출 됩니다.
  2. GetPageLengthAsync비동기 요청 즉시 반환한다 Task<int>Main"잠시 동안 대기, 나는 두 번째 당신에게 int를 반환합니다"라고.
  3. Main실행을 계속하고 비틀 거리며 lengthTask.Result메인 스레드가 차단되고 lengthTask작업이 완료 되기를 기다립니다 .
  4. GetStringAsync메인 스레드가 실행 Length되고 계속을 시작할 수있게 될 때까지 완료하고 기다립니다 .

하지만 내가 뭔가를 오해하는 것 같습니다. 이 코드가 교착 상태가 아닌 이유는 무엇입니까?

대기 / 비동기 교착 상태에 대한이 StackOverflow 질문 의 코드 는 동일한 작업을 수행하는 것처럼 보이지만 교착 상태입니다.

파나지오티스 카나 보스

await UI 스레드 (데스크톱 UI 응용 프로그램의 경우)이든 ASP.NET의 요청 컨텍스트 (코어가 아님)이든 원래 동기화 컨텍스트로 돌아갑니다.

GUI 애플리케이션에서는 UI 스레드가 .Result. await이 호출이 끝날 때까지 영원히 기다릴 것입니다.

콘솔 애플리케이션과 ASP.NET Core에는 동기화 컨텍스트가 없으므로 호출시 .Result교착 상태가 발생하지 않습니다.

VS 15.3 용 PS :

Visual Studio 2017 15.3 Preview 2 (gasp)는 비동기 메인 애플리케이션을 허용합니다. 그것으로 다음과 같이 쓸 수 있습니다.

public static Task Main()
{
    var length = await GetPageLengthAsync("http://csharpindepth.com");
    Console.WriteLine(length);
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

이 비동기/대기 코드가 교착 상태에 빠지지 않는 이유

이 코드가 교착 상태로 작동하지 않는 이유는 무엇입니까?

이 콘솔 앱의 비동기 대기 패턴으로 인해 교착 상태가 발생한 이유는 무엇입니까?

이 JavaScript 비동기 / 대기 코드가 예상대로 작동하지 않는 이유는 무엇입니까?

여기서 교착 상태가 발생하지 않는 이유는 무엇입니까?

코드가 교착 상태를 초래하지 않는 이유는 무엇입니까? 재진입 잠금 대 동기화 된 블록의 작동을 이해하려고합니까?

Actix 웹 처리기 내부의 Rusoto S3 스트림에서 읽기가 교착 상태를 일으키는 이유는 무엇입니까?

ContinueWith 교착 상태로 비 동기화 된 이유는 무엇입니까?

교착 상태를 일으키는 비동기 / 대기 예제

Windows 서비스에서 비동기 차단으로 인해 교착 상태가 발생하는 이유는 무엇입니까?

교착 상태로 이어지는 비동기 대기

이미지를 다운로드하는 동안 비동기 / 대기 교착 상태

내 비동기 코드가 비동기를 실행하지 않는 이유는 무엇입니까?

채널을 닫지 않고 코드가 교착 상태에있는 이유는 무엇입니까?

교착 상태가 발생하지 않는 이유는 무엇입니까?

WPF의 Dispatcher.Invoke가 주 스레드에서 실행될 때 교착 상태를 일으키지 않는 이유는 무엇입니까?

암시 적 잠금에 대해 교착 상태가 발생하지 않는 이유는 무엇입니까?

ASP.NET 컨텍스트에서 비동기 메서드를 호출 할 때 Task.Run (...). Result 교착 상태가 발생하지 않는 이유는 무엇입니까?

Java가 비교기 라인에서 동등 비교를 지원하지 않는 이유는 무엇입니까?

이 트리 워킹 기능이 교착 상태가되는 이유는 무엇입니까?

이 외래 키와 기본 키 조합으로 인해 Postgres 교착 상태가 발생하는 이유는 무엇입니까?

이 코드 조각에서 교착 상태가 발생할 수 있으며 그 이유는 무엇입니까?

이번 달 비교 코드가 제대로 작동하지 않는 이유는 무엇입니까?

동기화 된 메서드에서 교착 상태를 방지하는 방법은 무엇입니까?

이 코드가 교착 상태를 생성하는 이유는 무엇입니까?

Couchbase 비동기 Python 코드를 따르는 것이 작동하지 않는 이유는 무엇입니까?

정적 이니셜 라이저에서 람다가있는 병렬 스트림이 교착 상태를 일으키는 이유는 무엇입니까?

이 코드가 `치명적인 오류: 모든 고루틴이 잠자기 상태입니다 - 교착 상태!`라는 오류를 출력하는 이유는 무엇입니까?

gdb-mi가 비동기 대상 기능을 지원하지 않는 이유는 무엇입니까?