該類BackgroundService包含以下代碼:public virtual Task StartAsync(CancellationToken cancellationToken){ // Store the task we're executing _executingTask = ExecuteAsync(_stoppingCts.Token); // If the task is completed then return it, this will bubble cancellation and failure to the caller if (_executingTask.IsCompleted) { return _executingTask; } // Otherwise it's running return Task.CompletedTask;}我讀過https://www.markopapic.com/csharp-under-the-hood-async-await/這讓我假設所有代碼ExecuteAsync到它的第一個(如果有的話)await ...,在if (_executingTask.IsCompleted)到達之前執行。因此,如果 的那部分發生任何異常ExecuteAsync,或者如果ExecuteAsync返回Task.CompletedTask,那將導致執行return _executingTask;。我對此的理解正確嗎?
1 回答

慕田峪7331174
TA貢獻1828條經驗 獲得超13個贊
因此,如果 ExecuteAsync 的那部分發生任何異常,或者如果 ExecuteAsync 返回 Task.CompletedTask,將導致執行 return _executingTask;
更一般地,如果ExecuteAsync
同步完成,則StartAsync
返回從 返回的任務ExecuteAsync
。
在這種特殊情況下(使用后臺服務),我相信它旨在處理諸如前提條件檢查之類的事情,這些事情通常在異步方法開始時同步完成。因此,如果后臺服務同步確定它無法運行,StartAsync
則將返回一個錯誤的任務。
這種代碼極為罕見,設計也值得商榷。例如,如果后臺服務異步確定它不能運行,那么就沒有通知。我認為刪除整個塊的行為會更加一致if (_executingTask.IsCompleted)
,或者將ExecuteAsync
抽象更改為單獨InitializeAsync
的ExecuteAsync
部分。
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消