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

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

foreach 循環中的異步調用

foreach 循環中的異步調用

C#
繁星coding 2021-11-28 16:04:48
更多的概念問題......是否有任何理由在像這樣的 foreach 循環中對我的 DataContext 進行異步調用是一個壞主意?private async Task ProcessItems(List<Item> items){    var modifiedItems = new List<modifiedItem>();    foreach (var item in items)    {        // **edited to reflect link between items and properties**        // var properties = await _context.Properties        //   .Where(p => p.Condition == true).ToListAsync();        var properties = await _context.Properties          .Where(p => p.Condition == item.Condition).ToListAsync();        foreach (var property in properties)        {            // do something to modify 'item'            // based on the value of 'property'            // save to variable 'modifiedItem'            modifiedItems.Add(modifiedItem)        }    }    await _context.ModifiedItems.AddRangeAsync(modifiedItems);    await _context.SaveChangesAsync();}由于內部 foreach 循環依賴于properties變量,它是不是在properties變量完全實例化后才開始?由于modifiedItems變量是在父 foreach 循環之外聲明的,將每個異步添加modifiedItem到modifiedItems列表中是不是一個壞主意?實體框架、Linq 中是否有任何屬性/方法,或者更適合此類任務的任何屬性/方法?比做嵌入式 foreach 循環更好的主意?(如果有人想要一些上下文...... IRL,items是來自傳感器的讀數列表。并且properties是將原始讀數轉換為有意義的數據(例如不同單位的體積和重量)的數學方程......然后這些計算出的數據點正在存儲在數據庫中。)
查看完整描述

3 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

不,沒有,但是你在這里錯過了一些概念。

由于您使用異步方法,因此ProcessItems應調用該方法ProcessItemsAsync并返回一個task.

這對您有用:Async/Await - Best Practices in Asynchronous Programming

看你的需求了,建議添加CancellationToken并考慮異常處理,注意不要吞下異常。


查看完整回答
反對 回復 2021-11-28
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

在這種特定情況下,我改為編寫它來加載所有感興趣的傳感器的所有屬性的單個列表(考慮所有items并基于您macAddress/sensorKey您提到的屬性),并將其存儲在列表中。我們稱之為allProperties。我們await一次并避免重復進行數據庫調用。

然后,使用 LINQ To Objects 將您items的對象連接到allProperties它們匹配的對象。迭代該連接的結果,await循環內無需執行任何操作。


查看完整回答
反對 回復 2021-11-28
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

這里使用異步沒有問題,一旦等待異步調用,返回的對象是相同的。

如果您可以在循環外運行一次數據庫調用,并過濾內存中的數據以對其執行操作,您可能需要重新考慮在 foreach 中執行數據庫調用。每個用例都不同,您必須確??梢栽趦却嬷刑幚砀蟮姆祷丶?。

通常從數據庫中獲取 1000 行一次比 100 行快 10 倍。


查看完整回答
反對 回復 2021-11-28
  • 3 回答
  • 0 關注
  • 412 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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