Partager via


BackgroundService exécute l’ensemble d’ExecuteAsync en tant que tâche

BackgroundService exécute maintenant l’intégralité de ExecuteAsync sur un thread d'arrière-plan. Auparavant, la partie synchrone de ExecuteAsync (avant la première await) s’exécutait sur le thread principal lors du démarrage du service, ce qui empêche d’autres services de démarrer. Seul le code exécuté après le premier await a été exécuté sur un thread d’arrière-plan.

Version introduite

.NET 10

Comportement précédent

Précédemment, la partie synchrone a été exécutée par ExecuteAsync sur le thread principal et a bloqué le démarrage d’autres services.

Nouveau comportement

À partir de .NET 10, ExecuteAsync fonctionne entièrement sur un thread d'arrière-plan, et aucune de ses parties n'empêche le démarrage des autres services.

Type de changement cassant

Ce changement est un changement de comportement.

Raison de la modification

Le comportement précédent était un piège courant qui ne répondait pas aux attentes des utilisateurs. La plupart des implémenteurs de BackgroundService n'ont pas compris que la partie synchrone avant le premier await bloquait le démarrage d'autres services pendant le démarrage de l'application.

Si vous avez besoin qu'une partie de votre BackgroundService.ExecuteAsync s’exécute plus tôt pendant le démarrage (de façon synchrone et en bloquant d'autres services), vous pouvez effectuer l'une des opérations suivantes :

  • Placez le code qui doit s’exécuter de manière synchrone dans le constructeur, et il s’exécute dans le cadre de la construction du service.
  • Redéfinissez StartAsync et effectuez un travail avant d’appeler base.StartAsync. StartAsync conserve le comportement que sa partie synchrone s’exécute de manière synchrone pendant le démarrage et empêche d’autres services de démarrer.
  • Si vous souhaitez exécuter du code à un moment plus spécifique au démarrage du service, implémentez Microsoft.Extensions.Hosting.IHostedLifecycleService sur votre BackgroundService.
  • Renoncez entièrement à BackgroundService et concevez votre propre Microsoft.Extensions.Hosting.IHostedService.

API affectées