zoukankan      html  css  js  c++  java
  • 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高

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

  • 相关阅读:
    input框限制0开头的数字(0除外)
    圆角头像----CSS3特效
    html中div获取焦点,去掉input div等获取焦点时候的边框
    一些常用的html css整理--文本长度截取
    html5本地存储
    div块级元素获取焦点
    Intellij IDEA 搜索文件内容
    web安全漏洞防护
    Intellij IDEA 自动生成 serialVersionUID
    mysql 年龄计算(根据生日)
  • 原文地址:https://www.cnblogs.com/redfull/p/9633659.html
Copyright © 2011-2022 走看看