概述
我们在执行多线程的情况下,先根据信息的特性或主键 获取信息的唯一性字段,然后分组,
例如我们用会员信息为例:我们需要把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}rn", watch.Elapsed.TotalMinutes);
最后
以上就是可靠樱桃为你收集整理的多线程代码实现二的全部内容,希望文章能够帮你解决多线程代码实现二所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复