[c#] 문을 사용하고 키워드가 C #에서 멋지게 재생됩니다.

async반환 및 IDisposable인스턴스 메서드를 호출 하는 상황이 있습니다. 예를 들면 :

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));

이전 asyncIDisposable인스턴스 작업을 할 때 “response”변수를 사용하는이 호출과 코드는 using 문으로 래핑됩니다.

내 질문은 async키워드가 믹스에 던져 질 때 여전히 올바른 접근 방식인지 여부입니다 . 코드가 컴파일 되더라도 using 문은 아래 두 예제에서 모두 예상대로 작동합니까?

예 1

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    // Do something with the response

    return true;
}

예 2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}



답변

예, 괜찮습니다.

첫 번째 경우에는 실제로 다음과 같이 말합니다.

  • 응답을받을 수있을 때까지 비동기 적으로 기다립니다.
  • 그것을 사용하고 즉시 폐기하십시오

두 번째 경우에는 다음과 같이 말합니다.

  • 응답을받을 수있을 때까지 비동기 적으로 기다립니다.
  • 응답을 기록 할 때까지 비동기 적으로 기다립니다.
  • 응답 폐기

using비동기 메서드 의 문 Dispose은 리소스를 획득 한 스레드와 다른 스레드에서 호출이 실행될 수 있지만 (동기화 컨텍스트 등에 따라 다름) 여전히 발생 한다는 점에서 “이상한” 것입니다. 기다리고있는 것을 가정하면 지금 까지 보여줍니다 또는 물론, 실패합니다. ( 문에 반환되지 않는 메서드에 대한 호출이 포함 된 Dispose경우 비동기 코드에서 호출하지 않는 것과 같습니다 using.)


답변