BackgroundService kör hela ExecuteAsync som en uppgift

BackgroundService kör nu hela ExecuteAsync i en bakgrundstråd. Tidigare kördes den synkrona delen av ExecuteAsync (innan den första await) på huvudtråden under tjänstens start, vilket blockerade andra tjänster från att starta. Endast koden efter den första await kördes på en bakgrundstråd.

Version lanserad

.NET 10

Tidigare beteende

Tidigare kördes den synkrona delen av ExecuteAsync på huvudtråden och andra tjänster blockerades från att starta.

Nytt beteende

Från och med .NET 10 körs ExecuteAsync på en bakgrundstråd, och ingen del av den hindrar andra tjänster från att starta.

Typ av brytande ändring

Den här ändringen är en beteendeförändring.

Orsak till ändring

Det tidigare beteendet var en vanlig fallgrop som inte uppfyllde användarnas förväntningar. De flesta implementerare av BackgroundService förstod inte att den synkrona delen innan den första await blockerade andra tjänster från att starta under programstarten.

Om du kräver att någon del av din BackgroundService.ExecuteAsync körs tidigare under starten (synkront och blockerar andra tjänster) kan du göra något av följande:

  • Placera koden som måste köras synkront i konstruktorn och den körs som en del av servicekonstruktionen.
  • Åsidosätt StartAsync och utför lite arbete innan du anropar base.StartAsync. StartAsync bibehåller det beteendet där dess synkrona del körs synkront vid starten och hindrar andra tjänster från att starta.
  • Om du vill köra kod vid en mer specifik tidpunkt under tjänststarten implementerar Microsoft.Extensions.Hosting.IHostedLifecycleService du på din BackgroundService.
  • Avstå BackgroundService helt och implementera din egen Microsoft.Extensions.Hosting.IHostedService.

Berörda API:er