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


101

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;
}

답변:


97

예, 괜찮습니다.

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

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

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

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

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


4
고마워 Jon. 비동기 물건의 대부분은 나에게 여전히 부두이지만, 꽤는 다른 .NET 기능과 통합하는 빈도를보고 안심이야 그냥 작동
swingdoctor

@JonSkeet await는 using(){...}블록 내부에서도 사용되어야합니까, 아니면 과잉이거나 어떤 경우에는 성능을 저하시킬 수 있습니까? 않습니다 using(){...}같은 용도로 사용 await?

1
@nam : 아니, using와는 await완전히 다른 목적을 제공합니다. C # 8에는 이제 비동기 처리 기능도 있습니다. 그것의 가치가 내 대답 하이라이트 스레딩 문제를 인식하면서, 그 확실히 그것의 의미하지 않는다 잘못 섞어 usingawait.
Jon Skeet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.