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高

当然这个执行时间还是比较长,还得需要优化,这个优化就得在方法内部的业务逻辑的代码优化了

原文地址:https://www.cnblogs.com/redfull/p/9633659.html