我的問題是我在一個場景中,我有一個 API GetAllCards For Exp。然后我正在做一些并行的事情。 Foreach 例如 3 方 Api 呼叫和 Inter Db 呼叫似乎都作業正常,但是當涉及到存盤程序時,它會由于某種原因跳過它的執行并回傳 Null,即使我的空檢查 (?? 0) 在并行回圈中不起作用 有時可能有超過 100 個的卡片,并且存盤程序正在回傳卡片的每月總花費。我想要什么 ??我不想在并行回圈中跳過任何代碼塊,也不想增加 API 的回應時間。我已經嘗試了一些方法,但要么降低了 Api 的速度,要么他們開始行為不端。我可以' t 更改第三方 API 呼叫和 Sp 呼叫,因為第三方不提供任何其他方式,并且 Sps 已經在不到一秒的時間內快速執行。我正在使用物體框架 Db First Approach (Edmx)。
我嘗試過的:
將并行 ForEach 替換為自定義 ForeachAsync 以獲取參考鏈接
嘗試了參考鏈接的異步并行
3. 嘗試在回圈外初始化 ModelX(資料庫背景關系)
我的 Api 看起來像什么:
//third party api call
Cards Response = GetCards(Request);
try
{
Parallel.ForEach(Response.cards, item =>{
Modelx treaddb = new Modelx();
//internal db call for additional card info
item.CardInfo = treaddb.CardsTable.Where(x=> x.Cardnumber == item.Cardnumber).FirstOrDefault();
// this Sp Returns ObjectResult<decimel?> and a null check is also handled in sp level sp always return a value if null sp returns 0.00
item.CardInfo.TotalSpent = treaddb.sp_GetTotalSpendLimit(item.Cardnumber).FirstOrDefault() ?? 0;
// third party call
var cardstatus = GetCardStatus();
// then use it in Dto To Send Response
});
}
catch(Exception ex){
}
差不多就是這樣
uj5u.com熱心網友回復:
對于您的內部資料庫呼叫,我認為并行化查詢沒有多大幫助。
無論是 1 執行緒還是 100 執行緒,您仍然對 'CardsTable' 進行 100 次 DB 查詢,以及 'sp_GetTotalSpendLimit' 的 100 次 DB 查詢
我會嘗試這樣的事情,而不是進行 1 個 DB 查詢,一次回傳所有請求卡的卡資訊。
如果這可以縮短您的加載時間,我認為下一步是為“sp_GetTotalSpendLimit”添加另一個備用存盤程序,該程序類似地在一個資料庫查詢中回傳所有請求卡的詳細資訊。
至于第三方 API 呼叫,我認為您最好嘗試并行化它們。
//third party api call
Cards Response = GetCards(Request);
Modelx treaddb = new Modelx();
var allCardNumbers = Response.cards.Select(x => x.Cardnumber).ToList();
// Make one internal DB query for card info for all requested cards
var allCardInfo = treaddb.CardsTable.Where(x => allCardNumbers.Any(y => y == x.Cardnumber)).ToList();
try
{
Parallel.ForEach(Response.cards, item =>{
// Set additional card info from previous internal DB query
item.CardInfo = allCardInfo.FirstOrDefault(x=> x.Cardnumber == item.Cardnumber);
// this Sp Returns ObjectResult<decimel?> and a null check is also handled in sp level sp always return a value if null sp returns 0.00
item.CardInfo.TotalSpent = treaddb.sp_GetTotalSpendLimit(item.Cardnumber).FirstOrDefault() ?? 0;
// third party call
var cardstatus = GetCardStatus();
// then use it in Dto To Send Response
});
}
catch(Exception ex){
}
uj5u.com熱心網友回復:
我認為您正在尋找要并行運行的最大執行緒數Parallel.ForEach(items, new ParallelOptions{MaxDegreeOfParallelism = n}, item => { /* do something */ });
在哪里。n
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515590.html
