Les applications de base ASP.NET nécessitent souvent l'exécution périodique des tâches d'arrière-plan sans avoir un impact sur les demandes de l'utilisateur. Cet article explore une solution pour créer une tâche asynchrone récurrente, similaire à JavaScript setInterval()
.
Le défi:
L'objectif est d'exécuter régulièrement une méthode asynchrone (par exemple, l'envoi de données collectées à un service distant) sans bloquer les interactions utilisateur. La difficulté réside dans la planification de cette tâche asynchrone de manière appropriée.
Une solution simple (avec des mises en garde):
La classe. Cependant, la signature requise (Timer
) est incompatible avec une signature de méthode Elapsed
(void MethodName(object e, ElapsedEventArgs args)
). async
async Task MethodName(object e, ElapsedEventArgs args)
: Task.Delay()
Cette incompatibilité peut être surmontée à l'aide d'une boucle
, qui utilise en interne une minuterie: while
Task.Delay()
<code class="language-csharp">public async Task PeriodicFooAsync(TimeSpan interval, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { await FooAsync(); await Task.Delay(interval, cancellationToken); } }</code>
spécifié. L'ajout critique est FooAsync()
, permettant la terminaison gracieuse des tâches, particulièrement importante lors de l'arrêt de l'application. interval
cancellationToken
Bien que fonctionnel dans les applications .NET générales, cette approche nécessite la prudence dans le noyau ASP.NET. La nature "incendie et inoubliable" de cette méthode peut entraîner des problèmes. Pour une gestion des tâches de fond robuste dans ASP.NET Core, envisagez des solutions établies comme Hangfire ou les techniques détaillées dans "Fire and Forget on Asp.net" de Stephen Cleary et "Comment exécuter les tâches de fond de Scott Hanselman dans ASP.NET". Ces ressources fournissent des méthodes plus sophistiquées et fiables pour gérer les processus d'arrière-plan de longue date ou asynchrones dans l'environnement Core ASP.NET.
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!