sintaxis - Usar declaraciones y esperar a que las palabras clave se reproduzcan correctamente en c#
palabras reservadas en c# y su significado (1)
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 declaración 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 compila, ¿seguirá funcionando la declaración 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).