多线程代码实现二

我们在执行多线程的情况下,先根据信息的特性或主键 获取信息的唯一性字段,然后分组,

例如我们用会员信息为例:我们需要把4000万的会员信息进行标签处理,给会员打上不同特性的标签,

我们需要用多线程去处理,

        首先我们需要获取会员数量,然后对会员表中的主键 进去分组,下面是每一组200个会员

然后一次执行5组,也就是1000会员。

thread:一次执行的线程数量

decima :里面的除数200 跟下面分配数组的      copyList.Add((200 + 200* i).ToString());里面的200必须一致。

注意:这里的主键需要时id自增的类型,否则在后面就无法查询,不是自增的也必须可以排序的。

 

 

 

1:获取所以数据数量:并且除200,代表每一个线程执行200条数据,

统计组数,数量:count

        decimal decima = Convert.ToDecimal(memberlaber) / 200;
         int count = (int)Math.Ceiling(decima);

2:分配任务数组

真正的组数是 listobj  

 其他的只临时变量

 var listObj = new List<List<string>>();
           var copyList = new List<string>();
           List<string> subItemList;
           for (int i = Labercount; i < count; i++)
           {
               copyList.Add((i).ToString());
               copyList.Add((200 + 200* i).ToString());

               subItemList = new List<string>();
               subItemList.AddRange(copyList);

               listObj.Add(subItemList);
               copyList.Clear();
           }

3:分组完成 ,需要执行线程

下面的代码需要注意一下,thread是开的线程数量

      var watch = Stopwatch.StartNew();
           var option = new ParallelOptions { MaxDegreeOfParallelism = thread};

 

具体方法如下

listObj:上面分配的组

thread:线程数量

 

 

 var watch = Stopwatch.StartNew();
           var option = new ParallelOptions { MaxDegreeOfParallelism = thread};
           System.Threading.Tasks.Parallel.ForEach(listObj.AsParallel(), option, (parameter) =>
           {
               try
               {
                   Console.WriteLine("时间: " + DateTime.Now + " 会员信息ID号为:" + Convert.ToInt32(parameter[0]) * 200 + " 段号数据");

                   //构造传递的参数
                   Hashtable hs = new Hashtable();
                   hs.Add("pageIndex", parameter[0]);
                   hs.Add("pageSize", 200);

                   DataTable dt = member.QueryMember(hs);

                   if (dt != null && dt.Rows.Count > 0)
                   {
                       --- insert 到分类表
                       //IList<Hashtable> addhs = GetMemberCategory(dt);
                       //int result = cate.AddMemberCategory(addhs);
                       DataTable dtdetail = GetMemberCategorydt(dt);
                       int result = cate.BulkCopyDataToDB(dtdetail);
                   }
               }
               catch (Exception ex) 
               {
                   //Logger.WriteAppError(ex, parameter[0] + "号段报错");
                   Console.WriteLine(ex+parameter[0] + "号段报错"+ ex.Message);
               }
           });

           watch.Stop();
           Console.WriteLine("更新记录完成,用时{0}\r\n", watch.Elapsed.TotalMinutes);
 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值