業務開發,使用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高
當然這個執行時間還是比較長,還得需要優化,這個優化就得在方法內部的業務邏輯的代碼優化了