2 回答

TA貢獻1864條經驗 獲得超2個贊
我的目標是在一段時間后刪除一個項目。
那為什么不使用緩存呢?
使用 async void 好嗎?
的準則async void
是避免async void
,除非您正在實現事件處理程序(或邏輯上類似于事件處理程序的東西)。所以這里真正的問題是:RemoveLately
邏輯上是一個“事件處理程序”嗎?我可以看到一個可以被認為是一個論點的論點;具體來說,TryRemove
調用以響應計時器“事件”( Task.Delay
)。所以我不會絕對地說這async void
是錯誤的,但它確實有缺點。
如果有的話,這種做法的缺點是什么?
方法有一個主要問題async void
:其他代碼無法知道該方法何時完成。
這個主要問題表現在幾個方面:
您的代碼無法捕獲或處理來自
RemoveLately
. 由于無法觀察async void
方法的完成情況,因此也無法觀察異常。因此,async void
方法只是直接在其原始SynchronizationContext
. 在大多數情況下,這意味著方法中的異常async void
會使應用程序崩潰。async void
方法很難測試。這是因為單元測試代碼無法知道async void
方法何時完成。您的代碼無法知道何時可以安全關閉(其中“關閉”的范圍可能意味著“退出程序”或“處置
StateManager
”或介于兩者之間的任何內容)。這是因為您的代碼無法知道是否有async void
工作仍在進行中。在這種只是從緩存中刪除對象的特殊情況下RemoveLately
,這應該可以忽略,但在一般情況下async void
意味著應用程序永遠不知道它何時“完成”。

TA貢獻1784條經驗 獲得超9個贊
沒有 async void (幾乎)總是不好的(例如this)。正如 Stephen 在他的文章和此處的回答中所述,有一些理由需要使用異步 void 方法(即異步事件處理程序,除了 void 之外沒有任何其他“返回”值)。斯蒂芬在他的回答中解釋了您應該更改為異步任務的原因以及它們更好的原因。
這就是為什么我建議您的方法應該如下所示:
private async Task RemoveLately(int id)
{
await Task.Delay(10000).ConfigureAwait(false);
_states.TryRemove(id, out _);
}
作為一個小評論(如果我可以的話):如果你不確定選擇什么和/或你可以選擇Task(或Task<T>)或者async void然后嘗試使用Task因為在幾乎所有情況下(事件處理除外)你Task都比與async void。
- 2 回答
- 0 關注
- 103 瀏覽
添加回答
舉報