Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Zalecana akcja
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
StartAsynci wykonaj pewną pracę przed wywołaniembase.StartAsync.StartAsynczachowuje 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
BackgroundServicei zaimplementuj własne Microsoft.Extensions.Hosting.IHostedService.