Implémentation sécurisée de la méthode asynchrone Fire-and-Forget dans ASP.NET MVC : gestion des exceptions non gérées
Cet article explore les risques possibles et les meilleures pratiques lors de la mise en œuvre du modèle « déclencher et oublier » des méthodes asynchrones dans ASP.NET MVC, en se concentrant sur la façon de gérer les exceptions non observées. C'est une question courante.
Bien que les méthodes synchrones puissent être encapsulées pour être exécutées dans un thread séparé à l'aide de Task.Run
ou TaskFactory.StartNew
, les méthodes asynchrones présentent des défis uniques. L’appel direct d’une méthode asynchrone sans gestion appropriée des erreurs peut conduire à des exceptions inobservées, nécessitant une approche plus globale pour résoudre ce problème.
Une solution consiste à utiliser une méthode de wrapper personnalisée telle que :
<code class="language-csharp">private async void DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
Cette méthode peut être appelée dans TaskFactory.StartNew
et fournit un moyen plus sûr de gérer les exceptions. Cependant, cela nécessite d'écrire du code wrapper personnalisé pour chaque méthode asynchrone à exécuter.
Une autre option (suggérée par Stephen Cleary) consiste à utiliser le composant BackgroundTaskManager
. Cette approche permet d'enregistrer le travail synchrone et asynchrone et de gérer les exceptions via TaskScheduler.UnobservedTaskException
:
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
Il est important de noter que « tirer et oublier » doit être utilisé avec prudence. Si le résultat de DeleteFooAsync
est important, il est recommandé d'attendre la fin de la tâche. Toutefois, si un tel modèle est effectivement requis, ces solutions offrent des moyens efficaces de gérer les exceptions non observées et d’éviter les pannes potentielles du système.
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!