BackgroundService 将所有 ExecuteAsync 以任务形式运行

BackgroundService 现在在后台线程上运行整个 ExecuteAsync。 以前,在服务启动期间,同步部分ExecuteAsync(第一个await之前)在主线程上运行,阻止其他服务启动。 第一个 await 之后的代码仅在后台线程上运行。

已引入的版本

.NET 10

以前的行为

以前,主线程上运行的 ExecuteAsync 同步部分阻止了其他服务启动。

新行为

从 .NET 10 开始,所有 ExecuteAsync 在后台线程上运行,并且其中没有任何部分阻止其他服务启动。

破坏性变更的类型

此更改为行为更改

更改原因

以前的行为是不符合用户期望的常见陷阱。 大多数 BackgroundService 的实现者没有意识到,第一个 await 之前的同步部分阻塞了其他服务在应用程序启动过程中启动。

如果需要在启动过程中让您的BackgroundService.ExecuteAsync中的某个部分提前运行(同步并阻塞其他服务),可以执行以下任一操作:

  • 将需要同步运行的代码置于构造函数中,并将其作为服务构造的一部分执行。
  • 重写StartAsync并在调用base.StartAsync之前执行一些工作。 StartAsync 保留其同步部分在启动期间同步运行的行为,并阻止其他服务启动。
  • 如果要在服务启动期间更具体的时间运行代码,请在你的Microsoft.Extensions.Hosting.IHostedLifecycleService上实现BackgroundService
  • 完全舍弃 BackgroundService,并实现你自己的 Microsoft.Extensions.Hosting.IHostedService

受影响的 API