Aller au contenu

await using et IAsyncDisposable

Contexte : IAsyncDisposable est l’équivalent asynchrone de IDisposable. Il définit DisposeAsync() qui retourne ValueTask. L’instruction await using (C# 8.0+) vous permet de libérer des ressources de manière asynchrone, utile pour les classes qui effectuent un nettoyage asynchrone (ex. fermeture de flux réseau, vidage de tampons fichier).

using System;
using System.IO;
using System.Threading.Tasks;
public class AsyncResource : IAsyncDisposable
{
private FileStream _stream;
public AsyncResource(string path)
{
_stream = new FileStream(path, FileMode.OpenOrCreate);
}
public async ValueTask DisposeAsync()
{
if (_stream != null)
{
await _stream.FlushAsync();
await _stream.DisposeAsync();
}
GC.SuppressFinalize(this);
}
// Finaliseur optionnel si nécessaire
~AsyncResource() { }
}
public class AsyncUsingDemo
{
public static async Task UseAsyncResourceAsync()
{
await using (var resource = new AsyncResource("test.txt"))
{
// Utiliser la ressource
} // DisposeAsync() est attendu ici
}
}
Fenêtre de terminal
// Pas de sortie ; la libération asynchrone se fait en arrière‑plan.
  • await using nécessite que la ressource implémente IAsyncDisposable.
  • Si IDisposable et IAsyncDisposable sont tous deux implémentés, le compilateur préfère await using pour la libération asynchrone.

Lecteur de flux réseau – HttpResponseMessage implémente IAsyncDisposable. Utiliser await using garantit que le flux de réponse est libéré de manière asynchrone, rendant la connexion au pool.
Voir documentation .NET sur IAsyncDisposable.