2013-05-15 8 views
76

Mam sytuacji, w której wywołuję async wywołanie metody, która zwraca i instancji IDisposable. Na przykład:Czy przy użyciu instrukcji i poczekać na słowa kluczowe odtwarzać ładnie w C#

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

Teraz przed async był na scenie, podczas pracy z instancją IDisposable, to wywołanie i kod, który wykorzystał zmienną „odpowiedź” byłyby pakowane w użyciu instrukcji.

Moje pytanie brzmi, czy to nadal jest prawidłowe podejście, gdy słowo kluczowe async jest wrzucane do miksu? Mimo że kod się kompiluje, czy instrukcja using będzie działała zgodnie z oczekiwaniami w obu przykładach poniżej?

Przykład 1

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

    return true; 
} 

Przykład 2

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

    return true; 
} 

Odpowiedz

77

tak, że powinno być dobrze.

W pierwszym przypadku, jesteś naprawdę mówią:

  • asynchronicznie czekać aż możemy uzyskać odpowiedź
  • używać go i rozporządzania nim natychmiast

W drugim przypadku, mówisz:

  • Asynchronicznie zaczekaj, aż otrzymamy odpowiedź
  • asynchronicznie czekać, aż my zalogowany odpowiedź
  • dysponowania odpowiedzi

using oświadczenie w sposób asynchroniczny jest „dziwne”, że wezwanie Dispose może wykonać w innym wątku do tej, która nabył zasób (w zależności od kontekstu synchronizacji itp.), ale nadal będzie ... zakładając, że to, na co czekasz, to kiedykolwiek. (Tak jak nie zakończysz wywoływania Dispose w kodzie innym niż asynchroniczne, jeśli twoja instrukcja using zawiera wywołanie metody, która nigdy nie zwraca.)

+3

Dzięki Jon. Podczas gdy większość asynchronicznych rzeczy nadal jest dla mnie voodoo, to całkiem pocieszające jest to, jak często integruje się z innymi funkcjami .net i po prostu działa – swingdoctor

Powiązane problemy