亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在一定延遲后使用 async void 運行非 cpu 消耗任務是否好?

在一定延遲后使用 async void 運行非 cpu 消耗任務是否好?

C#
慕俠2389804 2022-11-22 16:07:37
這是我的代碼:class StateManager{    private readonly ConcurrentDictionary<int, bool> _states = new ConcurrentDictionary<int, bool>();    public void SetState(int id, bool state)    {        _states[id] = state;        if (!state)            RemoveLately(id);    }    private async void RemoveLately(int id)    {        await Task.Delay(10000).ConfigureAwait(false);        _states.TryRemove(id, out _);    }}我的目標是在一段時間后刪除一個項目。我不想使用 Task.RunRemoveLately因為它可能被調用數千次。如果有的話,這種做法的缺點是什么?
查看完整描述

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意味著應用程序永遠不知道它何時“完成”。


查看完整回答
反對 回復 2022-11-22
?
千萬里不及你

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。


查看完整回答
反對 回復 2022-11-22
  • 2 回答
  • 0 關注
  • 103 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號