2 回答

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

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