Parallel.ForEach 並行循環的使用


業務開發,使用foreach遍歷幾千條數據,並有一定的業務邏輯處理,執行非常耗時,想了一個優化辦法就是使用Parallel.ForEach 並行循環:

 

正常foreach的寫法:

#region
//foreach (var InspCategItem in InspCategList)
//{
// #region
// HiddenDangerModelTV hdtvItem = new HiddenDangerModelTV();
// hdtvItem.text = InspCategItem.Name;
// hdtvItem.nodeType = (int)nodeTypeEnum.檢查類別;
// hdtvItem.id = InspCategItem.Std_InspectionCategoryID;
// hdtvItem.hasChildren = true;
// hdtvItem.expanded = false;
// hdtvItem.Children = new List<HiddenDangerModelTV>();

// if (isRiskEvalSubItem)
// {
// hdtvItems.Add(hdtvItem);
// }
// else
// {
// if (isHaveEvalItem == 1)
// {
// var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
// if (isHaveItemList.Contains(hdtvItem.id))
// {
// hdtvItems.Add(hdtvItem);
// }
// }
// else if (isHaveEvalItem == 2)
// {
// //var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
// //if (!isHaveItemList.Contains(hdtvItem.id))
// //{
// // hdtvItems.Add(hdtvItem);
// //}
// }
// }

// FindInspItemImport(hdtvItem, itemCheckIdStr, isRiskEvalSubItem, siteGroupId, isHaveEvalItem);
// if (isHaveEvalItem == 2)
// {
// if (hdtvItem.Children.Count > 0)
// {
// hdtvItems.Add(hdtvItem);
// }
// }
// #endregion
//}
#endregion

 

第二種使用並行循環:

#region
Parallel.ForEach(InspCategList, InspCategItem =>
{
#region
HiddenDangerModelTV hdtvItem = new HiddenDangerModelTV();
hdtvItem.text = InspCategItem.Name;
hdtvItem.nodeType = (int)nodeTypeEnum.檢查類別;
hdtvItem.id = InspCategItem.Std_InspectionCategoryID;
hdtvItem.hasChildren = true;
hdtvItem.expanded = false;
hdtvItem.Children = new List<HiddenDangerModelTV>();

if (isRiskEvalSubItem)
{
hdtvItems.Add(hdtvItem);
}
else
{
if (isHaveEvalItem == 1)
{
var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
if (isHaveItemList.Contains(hdtvItem.id))
{
hdtvItems.Add(hdtvItem);
}
}
else if (isHaveEvalItem == 2)
{
//var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
//if (!isHaveItemList.Contains(hdtvItem.id))
//{
// hdtvItems.Add(hdtvItem);
//}
}
}

FindInspItemImport(hdtvItem, itemCheckIdStr, isRiskEvalSubItem, siteGroupId, isHaveEvalItem);
if (isHaveEvalItem == 2)
{
if (hdtvItem.Children.Count > 0)
{
hdtvItems.Add(hdtvItem);
}
}
#endregion
});
#endregion

 

System.Diagnostics.Stopwatch Watch1 = new System.Diagnostics.Stopwatch();
Watch1.Start();

中間是上面的兩段代碼的執行時間統計

Watch1.Stop();
var time = Watch1.ElapsedMilliseconds;

執行得出的結果:只使用foreach需要耗時15秒,使用Parallel.ForEach需要耗時11秒,所以說Parallel.ForEach效率比oreach高

當然這個執行時間還是比較長,還得需要優化,這個優化就得在方法內部的業務邏輯的代碼優化了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM