ASP .NET Core MVC – Libérer les ressources de manière asynchrone avec l’interface IDisposableAsync (C#)

Présentation

Depuis la version 3.0 du Framework .NET Core, Microsoft propose l’interface IDisposableAsync. Nous allons voir comment utiliser cette interface sur les contrôleurs des applications ASP .NET Core MVC, afin de libérer des ressources de manière asynchrone.

Mise en œuvre

Voici un contrôleur implémentant l’interface IDisposableAsync :

public class HomeController : Controller, IAsyncDisposable
{
    private readonly ILogger<HomeController> _logger;
    private Utf8JsonWriter _jsonWriter;

    public HomeController(ILogger<HomeController> logger)
    {
        this._logger = logger;
        this._jsonWriter = new Utf8JsonWriter(new MemoryStream());
    }

    public IActionResult Index()
    {
        return this.View();
    }

    public async ValueTask DisposeAsync()
    {
        // Dispose asynchrone.
        await this.DisposeCoreAsync();

        // Dispose des ressources non managées
        this.Dispose(false);

        // Pour que le Garbage Collector n'appelle pas le finaliseur.
        GC.SuppressFinalize(this);
    }

    protected async virtual ValueTask DisposeCoreAsync()
    {
        if (this._jsonWriter is not null)
            await this._jsonWriter.DisposeAsync();

        this._jsonWriter = null;
    }
}

L’attribut nommé jsonWriter de type Utf8JsonWriter est une « ressource » (au sens objet) qu’il est possible de libérer de manière asynchrone.

La méthode DisposeCoreAsync est une méthode polymorphe dont le but est de libérer les ressources de manière asynchrone en agissant sur l’objet JsonWriter. Elle pourra être redéfinie dans les classes dérivées si elles doivent aussi libérer des ressources de manière asynchrone. Elle est appelée dans la méthode DisposeAsync proposée par l’interface IDisposableAsync.

Étiquettes :

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j'alterne les missions de formation et d'ingénierie avec cette plateforme. J'écris ce blog pour transmettre mes connaissances à tout développeur, qu'il soit débutant ou expérimenté.