Freigeben über


Der BackgroundService führt den gesamten ExecuteAsync als Task aus.

BackgroundService führt nun den gesamten ExecuteAsync auf einem Hintergrundthread aus. Zuvor wurde der synchrone Teil von ExecuteAsync (vor dem ersten await) während des Dienststarts im Hauptthread ausgeführt und blockiert damit den Start anderer Dienste. Nur der Code, der nach dem ersten await ausgeführt wurde, lief in einem Hintergrundthread.

Eingeführt in Version

.NET 10

Vorheriges Verhalten

Zuvor lief der synchrone Teil von ExecuteAsync im Hauptthread und blockierte den Start anderer Dienste.

Neues Verhalten

Ab .NET 10 laufen alle ExecuteAsync Vorgänge in einem Hintergrundthread, und kein Teil davon blockiert andere Dienste daran, zu starten.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für Änderung

Das vorherige Verhalten war eine häufige Stolperfalle, die nicht den Erwartungen der Benutzer entsprach. Die meisten Implementierer von BackgroundService haben nicht verstanden, dass der synchrone Teil vor dem ersten await den Prozess anderer Dienste während des Anwendungsstarts blockierte.

Wenn Sie einen Teil Ihres BackgroundService.ExecuteAsync beim Start früher ausführen lassen möchten (synchron und andere Dienste blockierend), können Sie eine der folgenden Optionen wählen:

  • Platzieren Sie den Code, der synchron ausgeführt werden muss, im Konstruktor, sodass er als Teil der Diensterstellung ausgeführt wird.
  • Überschreiben StartAsync und erledigen Sie vor dem Aufrufen base.StartAsynceinige Aufgaben. StartAsync behält das Verhalten bei, dass sein synchroner Teil beim Start synchron ausgeführt wird und andere Dienste am Starten hindert.
  • Wenn Sie Code während des Dienststarts zu einem genaueren Zeitpunkt ausführen möchten, implementieren Sie Microsoft.Extensions.Hosting.IHostedLifecycleService in Ihrem BackgroundService.
  • BackgroundService Verzichten Sie ganz und implementieren Sie Ihre eigenen Microsoft.Extensions.Hosting.IHostedService.

Betroffene APIs