2013-05-15 11 views
76

Ho una situazione in cui sto effettuando una chiamata async a un metodo che restituisce e l'istanza IDisposable. Per esempio:L'uso di istruzioni e l'attesa di parole chiave si adattano bene in C#

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

Ora, prima async era sulla scena, quando si lavora con un IDisposable esempio, questa chiamata e il codice che ha utilizzato la variabile "risposta" sarebbe avvolto in un'istruzione using.

La mia domanda è se questo è ancora l'approccio corretto quando la parola chiave async viene generata nel mix? Anche se il codice viene compilato, l'istruzione using funzionerà come previsto in entrambi gli esempi di seguito?

Esempio 1

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

    return true; 
} 

Esempio 2

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

    return true; 
} 

risposta

77

Sì, che dovrebbe andare bene.

Nel primo caso, si sta davvero dicendo:

  • in modo asincrono aspettare fino a quando siamo in grado di ottenere la risposta
  • usarlo e disporne immediatamente

Nel secondo caso, stai dicendo:

  • Asincronicamente attendere fino a quando non è possibile ottenere la risposta
  • asincrono aspettare fino a quando abbiamo registrato l'risposta
  • Smaltire la risposta

Un using dichiarazione in un metodo asincrono è "strano", in quanto la chiamata Dispose può eseguire in un thread diverso da quello che acquisito la risorsa (a seconda del contesto di sincronizzazione, ecc.) ma succederà ancora ... supponendo che la cosa che stai aspettando sia mai mostrata o fallita, ovviamente. (Proprio come non finirai per chiamare Dispose in codice non asincrono se la tua istruzione using contiene una chiamata a un metodo che non ritorna mai.)

+3

Grazie Jon. Mentre la maggior parte delle cose asincrone è ancora voodoo per me, è abbastanza rassicurante vedere quanto spesso si integri con altre caratteristiche .net e funzioni solo – swingdoctor