次の方法で共有


BackgroundService は、すべての ExecuteAsync をタスクとして実行します

BackgroundService では、バックグラウンド スレッドで ExecuteAsync 全体が実行されるようになりました。 以前は、(最初のExecuteAsyncの前に) awaitの同期部分がサービスの起動中にメイン スレッドで実行され、他のサービスの開始がブロックされました。 最初の await の後のコードのみがバックグラウンド スレッドで実行されました。

導入されたバージョン

.NET 10

以前の動作

以前は、 ExecuteAsync の同期部分がメイン スレッドで実行され、他のサービスの開始がブロックされました。

新しい動作

.NET 10 以降では、すべての ExecuteAsync がバックグラウンド スレッドで実行され、その一部が他のサービスの開始をブロックしません。

破壊的変更の種類

この変更は 動作の変更です。

変更の理由

前の動作は、ユーザーの期待を満たさなかった一般的な落とし穴でした。 BackgroundServiceのほとんどの実装者は、最初のawait前の同期部分が、アプリケーションの起動時に他のサービスの開始をブロックすることを理解していませんでした。

(同期的に他のサービスをブロックして) 起動中に BackgroundService.ExecuteAsync の一部を実行する必要がある場合は、次のいずれかを実行できます。

  • コンストラクターに同期的に実行する必要があるコードを配置し、サービス構築の一部として実行します。
  • StartAsyncをオーバーライドし、base.StartAsyncを呼び出す前に何らかの作業を行います。 StartAsync は、同期部分が起動時に同期的に実行され、他のサービスの開始をブロックする動作を保持します。
  • サービスの起動時により具体的な時間にコードを実行する場合は、Microsoft.Extensions.Hosting.IHostedLifecycleServiceBackgroundServiceを実装します。
  • BackgroundServiceを完全にやめて、独自のMicrosoft.Extensions.Hosting.IHostedServiceを実装します。

影響を受ける API