BackgroundService 現在在後台執行緒上運行整個ExecuteAsync。 先前,ExecuteAsync 的同步部分(在第一個 await 之前)在服務啟動期間於主執行緒上運行,阻礙了其他服務的啟動。 只有第一個 await 之後的程式碼會在背景執行緒上執行。
推出的版本
.NET 10
先前的行為
先前,同步 ExecuteAsync 部分在主執行緒上運行並阻止其他服務啟動。
新行為
從 .NET 10 開始,ExecuteAsync 的所有內容都會在背景執行緒上運行,而且任何部分都不會阻礙其他服務啟動。
破壞性變更的類型
此變更為行為變更。
變更的原因
先前的行為是常見的陷阱,無法滿足使用者的期望。 大多數 BackgroundService 的實作者不了解,第一個 await 之前的同步部分在應用程式啟動期間會阻止其他服務啟動。
建議的動作
如果您需要在 BackgroundService.ExecuteAsync 啟動期間儘早執行 (同步並封鎖其他服務) ,您可以執行下列任一項作業:
- 將需要同步執行的程式碼放在建構函式中,它會作為服務建構的一部分執行。
- 覆寫
StartAsync並執行一些工作,然後再呼叫base.StartAsync。StartAsync保留其同步部分在啟動期間同步執行的行為,並封鎖其他服務啟動。 - 如果您想要在服務啟動期間在更特定的時間執行程式碼,請在
BackgroundService上實作 Microsoft.Extensions.Hosting.IHostedLifecycleService。 - 完全放棄
BackgroundService並自行實作 Microsoft.Extensions.Hosting.IHostedService。