Maison >développement back-end >C++ >En quoi les méthodes Async Void et Async Task diffèrent-elles dans la gestion des opérations en suspens dans ASP.NET ?

En quoi les méthodes Async Void et Async Task diffèrent-elles dans la gestion des opérations en suspens dans ASP.NET ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-04 01:43:41866parcourir

How Do Async Void and Async Task Methods Differ in Handling Outstanding Operations in ASP.NET?

Nombre d'opérations en suspens dans Async Void et Async Task dans ASP.Net

Dans les applications ASP.Net, une méthode async void diffère de une méthode Task asynchrone dans sa gestion des opérations en suspens. Cette distinction peut conduire à l'exception suivante avec async void mais pas avec async Task :

System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending

Comprendre Async Void

Async void incrémente le nombre d'opérations en attente lorsque appelé et le décrémente une fois terminé. Cela implique que cela n'entraîne pas vraiment un comportement « lancer et oublier », car ASP.Net suit son achèvement.

Pourquoi la tâche asynchrone fonctionne-t-elle ?

Quand renvoyant une tâche, le nombre d’opérations en attente n’augmente pas. Au lieu de cela, le framework gère l'attente de manière asynchrone que la tâche renvoyée soit terminée. Cette approche élimine le risque d'exception mentionnée ci-dessus.

Exemple

public class HomeController : AsyncController
{
    // Will work fine (no exception)
    public async Task<ActionResult> ThisPageWillLoad()
    {
        // Fire and forget task
        this.FireAndForgetTask();

        return await Task.FromResult(this.View("Index"));
    }

    private async Task FireAndForgetTask()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }

    // Will result in an exception due to async void
    public async Task<ActionResult> ThisPageWillNotLoad()
    {
        this.FireAndForgetVoid();

        return await Task.FromResult(this.View("Index"));
    }

    private async void FireAndForgetVoid()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }
}

Contexte historique

Microsoft a priorisé à rebours compatibilité et "un ASP.NET" lors de l'introduction de l'async à ASP.Net. Ils ont maintenu la prise en charge des composants EAP mais ont amélioré le noyau ASP.Net SynchronizationContext pour détecter et exclure toute utilisation inappropriée de async void dans certains scénarios. Dans le monde MVC/WebAPI/SignalR, les frameworks ont naturellement adopté la tâche asynchrone, éliminant ainsi le besoin de vide asynchrone.

Conclusion

Dans les applications ASP.Net modernes, il est généralement Il est recommandé d'éviter le vide asynchrone et de renvoyer la tâche à la place. Cette approche garantit un suivi approprié des opérations en suspens et élimine le risque d'exception susmentionnée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn