更多的概念問題......是否有任何理由在像這樣的 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
并考慮異常處理,注意不要吞下異常。

HUWWW
TA貢獻1874條經驗 獲得超12個贊
在這種特定情況下,我改為編寫它來加載所有感興趣的傳感器的所有屬性的單個列表(考慮所有items
并基于您macAddress
/sensorKey
您提到的屬性),并將其存儲在列表中。我們稱之為allProperties
。我們await
一次并避免重復進行數據庫調用。
然后,使用 LINQ To Objects 將您items
的對象連接到allProperties
它們匹配的對象。迭代該連接的結果,await
循環內無需執行任何操作。

慕尼黑的夜晚無繁華
TA貢獻1864條經驗 獲得超6個贊
這里使用異步沒有問題,一旦等待異步調用,返回的對象是相同的。
如果您可以在循環外運行一次數據庫調用,并過濾內存中的數據以對其執行操作,您可能需要重新考慮在 foreach 中執行數據庫調用。每個用例都不同,您必須確??梢栽趦却嬷刑幚砀蟮姆祷丶?。
通常從數據庫中獲取 1000 行一次比 100 行快 10 倍。
- 3 回答
- 0 關注
- 412 瀏覽
添加回答
舉報
0/150
提交
取消