共用方式為


BackgroundService 會將所有 ExecuteAsync 作為任務來執行

BackgroundService 現在在後台執行緒上運行整個ExecuteAsync。 先前,ExecuteAsync 的同步部分(在第一個 await 之前)在服務啟動期間於主執行緒上運行,阻礙了其他服務的啟動。 只有第一個 await 之後的程式碼會在背景執行緒上執行。

推出的版本

.NET 10

先前的行為

先前,同步 ExecuteAsync 部分在主執行緒上運行並阻止其他服務啟動。

新行為

從 .NET 10 開始,ExecuteAsync 的所有內容都會在背景執行緒上運行,而且任何部分都不會阻礙其他服務啟動。

破壞性變更的類型

此變更為行為變更

變更的原因

先前的行為是常見的陷阱,無法滿足使用者的期望。 大多數 BackgroundService 的實作者不了解,第一個 await 之前的同步部分在應用程式啟動期間會阻止其他服務啟動。

如果您需要在 BackgroundService.ExecuteAsync 啟動期間儘早執行 (同步並封鎖其他服務) ,您可以執行下列任一項作業:

  • 將需要同步執行的程式碼放在建構函式中,它會作為服務建構的一部分執行。
  • 覆寫 StartAsync 並執行一些工作,然後再呼叫 base.StartAsyncStartAsync 保留其同步部分在啟動期間同步執行的行為,並封鎖其他服務啟動。
  • 如果您想要在服務啟動期間在更特定的時間執行程式碼,請在 BackgroundService 上實作 Microsoft.Extensions.Hosting.IHostedLifecycleService
  • 完全放棄 BackgroundService 並自行實作 Microsoft.Extensions.Hosting.IHostedService

受影響的 API