Gérez en toute sécurité le type "fire-and-forget" dans les méthodes asynchrones ASP.NET MVC
Bien que l'approche « lancer et oublier » ne soit généralement pas recommandée dans les applications ASP.NET, il peut y avoir des situations où il est nécessaire d'appeler une méthode asynchrone sans attendre qu'elle se termine. Cependant, l’exécution de méthodes asynchrones de manière aléatoire comporte certains risques et limites.
L'un des risques est que les exceptions non gérées dans les méthodes asynchrones passent inaperçues et peuvent conduire à un comportement inattendu. Pour résoudre ce problème, il est recommandé de s'abonner aux événements TaskScheduler.UnobservedTaskException
pour journaliser les exceptions et éviter qu'elles ne provoquent le crash de l'application.
Une autre option consiste à créer une méthode wrapper qui gère l'exception dans la méthode asynchrone comme ceci :
<code class="language-csharp">private async Task DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception ) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
Cependant, sachez qu'encapsuler chaque méthode asynchrone avec un bloc try-catch peut devenir verbeux et répétitif.
Une autre approche consiste à utiliser le runtime ASP.NET pour enregistrer le travail asynchrone. Grâce à la bibliothèque BackgroundTaskManager
de Scott Hanselman, vous pouvez exécuter des tâches simultanément et enregistrer les exceptions de manière centralisée :
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
Cette méthode enregistre la tâche auprès du runtime, lui permettant de continuer à s'exécuter une fois la requête ASP.NET terminée tout en interceptant les exceptions.
Enfin, si vous avez vraiment besoin d'exécuter une méthode asynchrone de manière "fire-and-forget" sans gestion des exceptions, vous pouvez utiliser Task.Run()
pour créer un nouveau thread pour l'opération asynchrone :
<code class="language-csharp">Task foo = Task.Run( () => DeleteFooAsync() );</code>
Cependant, il est important de se rappeler que la méthode "fire-and-forget" ne doit être utilisée que si vous pouvez tolérer les conséquences potentielles d'exceptions non gérées.
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!