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。