第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在一定延遲后使用 async void 運(yùn)行非 cpu 消耗任務(wù)是否好?

在一定延遲后使用 async void 運(yùn)行非 cpu 消耗任務(wù)是否好?

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 _);    }}我的目標(biāo)是在一段時(shí)間后刪除一個(gè)項(xiàng)目。我不想使用 Task.RunRemoveLately因?yàn)樗赡鼙徽{(diào)用數(shù)千次。如果有的話,這種做法的缺點(diǎn)是什么?
查看完整描述

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í)“完成”。


查看完整回答
反對(duì) 回復(fù) 2022-11-22
?
千萬(wàn)里不及你

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。


查看完整回答
反對(duì) 回復(fù) 2022-11-22
  • 2 回答
  • 0 關(guān)注
  • 110 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)