J’ai une situation où je fais un appel async
à une méthode qui renvoie une instance IDisposable
. Par exemple:
HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));
Maintenant, avant que async
soit sur la scène, lorsque vous travaillez avec une instance IDisposable
, cet appel et ce code qui utilisaient la variable “response” seraient enveloppés dans une instruction using.
Ma question est de savoir si c’est toujours la bonne approche lorsque le mot clé async
est ajouté au mélange? Même si le code comstack, l’instruction using fonctionnera-t-elle toujours 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; }
Oui, ça devrait aller.
Dans le premier cas, vous dites vraiment:
Dans le second cas, vous dites:
Une instruction using
dans une méthode asynchrone est “étrange” dans la mesure où l’appel 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 attendre pour toujours montre ou échoue, bien sûr. (Tout comme vous ne finirez pas par appeler Dispose
dans un code non asynchrone si votre instruction using
contient un appel à une méthode qui ne revient jamais.)