Usar declaraciones y esperar a que las palabras clave se reproduzcan correctamente en c #

Tengo una situación en la que estoy realizando una llamada async a un método que devuelve IDisposable instancia IDisposable . Por ejemplo:

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

Ahora, antes de que async estuviera en escena, cuando se trabajaba con una instancia IDisposable , esta llamada y el código que usaba la variable “respuesta” se envolverían en una statement de uso.

Mi pregunta es si ese sigue siendo el enfoque correcto cuando se lanza la palabra clave async en la mezcla. A pesar de que el código se comstack, ¿seguirá funcionando la statement de uso como se espera en ambos ejemplos a continuación?

Ejemplo 1

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

Ejemplo 2

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

Si, eso debería estar bien.

En el primer caso, realmente estás diciendo:

  • Espera asíncronamente hasta que podamos obtener la respuesta
  • Úselo y deséchelo inmediatamente

En el segundo caso, estás diciendo:

  • Espera asíncronamente hasta que podamos obtener la respuesta
  • Espera asíncronamente hasta que hayamos registrado la respuesta
  • Eliminar la respuesta

Una instrucción de using en un método asíncrono es “extraña” porque la llamada Dispose puede ejecutar en un hilo diferente al que adquirió el recurso (dependiendo del contexto de sincronización, etc.) pero seguirá sucediendo … asumiendo que lo que está esperando por siempre aparece o falla, por supuesto. (Al igual que no terminará llamando a Dispose en un código no asincrónico si su instrucción de using contiene una llamada a un método que nunca regresa).