sirven sintaxis significado reservadas que para palabras lenguaje instrucciones comandos claves c# asynchronous using-statement

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).