Sdílet prostřednictvím


BackgroundService spouští celý ExecuteAsync jako úlohu.

BackgroundService nyní běží celý na vlákně ExecuteAsync na pozadí. Dříve se synchronní část ExecuteAsync (před prvním await) spouštěla na hlavním vlákně během spouštění služby, což blokovalo spuštění jiných služeb. Pouze kód po prvním await běžel na vlákně na pozadí.

Verze byla představena

.NET 10

Předchozí chování

Dříve běžela synchronní část ExecuteAsync na hlavním vlákně a blokovala spouštění jiných služeb.

Nové chování

Počínaje verzí .NET 10, všechny ExecuteAsync běží na vlákně na pozadí a ani jedna jeho část nezablokuje spuštění jiných služeb.

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Předchozí chování bylo běžnou nástrahou, které nesplnilo očekávání uživatelů. Většina implementátorů BackgroundService nepochopila, že synchronní část před prvním await blokovala spuštění ostatních služeb během startu aplikace.

Pokud potřebujete, aby se některá část vašeho BackgroundService.ExecuteAsync spustila dříve během startu (synchronně a blokovala ostatní služby), můžete udělat následující:

  • Umístěte kód, který je potřeba spustit synchronně v konstruktoru, a spustí se jako součást konstrukce služby.
  • Přepište StartAsync a proveďte nějakou práci před voláním base.StartAsync. StartAsync zachovává chování, že jeho synchronní část probíhá synchronně při spuštění systému a blokuje spuštění jiných služeb.
  • Pokud chcete spustit kód v konkrétnější době během spouštění služby, implementujte Microsoft.Extensions.Hosting.IHostedLifecycleService na svém BackgroundService.
  • Vzdejte se BackgroundService zcela a implementujte svůj vlastní Microsoft.Extensions.Hosting.IHostedService.

Ovlivněná rozhraní API