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高
当然这个执行时间还是比较长,还得需要优化,这个优化就得在方法内部的业务逻辑的代码优化了