Fire and Forget et Awaiting en Async/Await : différences et scénarios d'utilisation
Le code suivant montre les différentes manières d'appeler la méthode Callee
et leurs différences de comportement.
Appel n°1 : Feu et oublier (simple)
Callee
La méthode est appelée de manière asynchrone et ne bloque pas l'appelant.
Appel n°2 : Tâche en attente (délai)
La méthodeCallee
utilise le mot-clé await
et l'appelant attend qu'elle se termine. Puisque la méthode Callee
contient un délai de 1000 ms, cela prendra plus d'une seconde à l'appelant.
Appels n°3 et n°5 : Task.Run (Tire et oublier)
Task.Run
Soumet la méthode Callee
au pool de threads pour exécution. Puisque await
n'est pas utilisé, les deux appels sont Fire et Forget et ne bloquent pas l'appelant.
Appels n°4 et n°6 : Task.Run (Attendre la tâche)
Semblable aux n°3 et n°5, mais Task.Run
utilise await
en interne. Cela les rend équivalents au n°2, l'appelant attendra que la tâche soit terminée.
La différence entre le #3 et le #5
Bien que les numéros 3 et 5 utilisent tous deux Task.Run
, il existe des différences subtiles. Dans #3, Callee
est appelé directement pour créer une nouvelle tâche sur le pool de threads. Dans #5, Callee
est enveloppé dans une expression lambda asynchrone, qui crée une nouvelle tâche avec sa propre machine à états. Cependant, comme les deux missions sont Fire and Forget, la différence n'est pas significative dans ce cas.
Remarques sur Service Fabric
Après la migration vers Service Fabric, HostingEnvironment.QueueBackgroundWorkItem
n'est plus pris en charge. Bien qu'il soit possible d'utiliser Task.Run
comme alternative, il est préférable d'utiliser un processus en arrière-plan distinct et de communiquer avec lui via une file d'attente. Cela garantit l'isolation entre les services front-end et back-end, évitant ainsi les problèmes de performances ou les blocages.
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!