最近要处理一个业务,从数据库查了一个数据,无奈的是,数据竟然有10万条,我这边需要对这些数据做处理,如果一条一条执行,速度很明显太慢,我突然想到了分页+多线程的技巧,上代码:
新建一个Demo3类,模拟添加10万条数据
//demo3为模拟类
class Demo3
{
public int Id { get; set; }
public string Name { get; set; }
}
//模拟10万条数据
List<Demo3> dimo = new List<Demo3>();
for (int i = 0; i < 100001; i++)
{
Demo3 demo3 = new Demo3();
demo3.Id=i;
demo3.Name="站三"+i.ToString();
dimo.Add(demo3);
}
1、将10万条数据,每1000条数据,做一个分页,得出需要分多少页
//获取demo3有多少页
int count = dimo.Count();//100001
//使用Math.Ceiling(进1法)计算出需要分多少页
decimal can = Math.Ceiling(Convert.ToDecimal(count)/ Convert.ToDecimal(1000));
2、使用Task处理数据
//新建一个Task
List<Task> taskList = new List<Task>();
for (int i = 1; i <= can; i++)
{
//处理List分页函数
List<Demo3> data = SplitList<Demo3>(dimo, i, 1000);
//将需要处理的数据,放到List<Task>
taskList.Add( Task.Factory.StartNew(() => {
Sleep(data);
}));
}
//等待Task处理
Task.WaitAll(taskList.ToArray());
3、分页数据处理
public static List<T> SplitList<T>(List<T> _list, int PageIndex, int PageSize)
{
int _PageIndex = PageIndex == 0 ? 1 : PageIndex;
int _PageSize = PageSize == 0 ? 20 : PageSize;
int PageConut = (int)Math.Ceiling(Convert.ToDecimal(_list.Count) / _PageSize);
if (PageConut >= _PageIndex)
{
List<T> list = new List<T>();
list = _list.Skip((_PageIndex - 1) * _PageSize).Take(_PageSize).ToList();
return list;
}
else
return _list;
}
4、模拟线程数据
private static void Sleep(List<Demo3> demo3s)
{
foreach (var item in demo3s)
{
Thread.Sleep(1000);
}
}
这样主要解决的是或者数据处理的部分,用线程并行全部处理了,最终完成时间取决于数据多多的一个Task。