96 votes

Les instructions using et les mots-clés await fonctionnent-ils bien en C# ?

Je suis dans une situation où je fais un async appel à une méthode qui renvoie et IDisposable instance. Par exemple :

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

Maintenant, avant async était sur place, en travaillant avec un IDisposable Par exemple, cet appel et le code qui utilise la variable "response" seraient enveloppés dans une instruction using.

Ma question est de savoir si c'est toujours l'approche correcte quand la async le mot-clé est jeté dans le mélange ? Même si le code se compile, l'instruction using fonctionnera-t-elle comme prévu dans les deux exemples ci-dessous ?

Exemple 1

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

    return true;
}

Exemple 2

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

    return true;
}

94voto

Jon Skeet Points 692016

Oui, ça devrait aller.

Dans le premier cas, vous dites en fait :

  • Attendre de manière asynchrone que nous puissions obtenir la réponse
  • Utilisez-le et jetez-le immédiatement

Dans le second cas, vous dites :

  • Attendre de manière asynchrone que nous puissions obtenir la réponse
  • Attendre de manière asynchrone que la réponse soit enregistrée.
  • Éliminer la réponse

A using dans une méthode async est "étrange" dans la mesure où l'instruction Dispose peut s'exécuter dans un thread différent de celui qui a acquis la ressource (en fonction du contexte de synchronisation, etc.) mais il se produira quand même... en supposant que la chose que vous attendez jamais se montre ou échoue, bien sûr. (Tout comme vous ne finirez pas par appeler Dispose dans du code non-asynchrone si votre using contient un appel à une méthode qui ne revient jamais).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X