Udostępnij przez


Usługa BackgroundService uruchamia całą metodę ExecuteAsync jako zadanie

BackgroundService teraz uruchamia całą część wątku ExecuteAsync w tle. Wcześniej synchroniczna część ExecuteAsync (przed pierwszym await) była uruchamiana w głównym wątku podczas uruchamiania usługi, blokując uruchamianie innych usług. Tylko kod po pierwszym await działał na wątku w tle.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej synchroniczna część działała na głównym wątku ExecuteAsync, powodując zablokowanie uruchamiania innych usług.

Nowe zachowanie

Począwszy od platformy .NET 10, cały ExecuteAsync działa na wątku w tle i żadna jego część nie blokuje uruchamiania innych usług.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Poprzednie zachowanie było typową pułapką, które nie spełniały oczekiwań użytkowników. Większość implementatorów BackgroundService nie wiedziała, że część synchroniczna przed pierwszym await zablokowała uruchamianie innych usług podczas uruchamiania aplikacji.

Jeśli wymagasz, aby jakakolwiek część twojego BackgroundService.ExecuteAsync działała wcześniej podczas uruchamiania (synchronicznie i blokując inne usługi), możesz wykonać jedną z następujących operacji:

  • Umieść kod, który musi być uruchamiany synchronicznie w konstruktorze, a następnie wykonywany w ramach budowy usługi.
  • Zastąp StartAsync i wykonaj pewną pracę przed wywołaniem base.StartAsync. StartAsync zachowuje zachowanie polegające na tym, że jego część synchroniczna jest uruchamiana synchronicznie podczas startu i blokuje uruchamianie innych usług.
  • Jeśli chcesz uruchamiać kod w bardziej precyzyjnym momencie podczas uruchamiania usługi, zaimplementuj Microsoft.Extensions.Hosting.IHostedLifecycleService na swoim BackgroundService.
  • Zrezygnuj całkowicie z BackgroundService i zaimplementuj własne Microsoft.Extensions.Hosting.IHostedService.

Interfejsy API, których dotyczy problem