应用场景:假设有100条数据需要处理,很费时间,为了处理得更快,每次开起十个线程“同时”处理数据,等这十个线程结束后,再开起十个线程处理数据,直到数据全部处理完成。WaitHandle.WaitAll最多只支持64个线程,这里为了测试,假设最多只支持5个线程,所以一个ManualResetEvent列表不够用,这里使用的是ManualResetEvent列表的数组。这样,理论上可以将处理数据的时间缩短至大约十分之一。(我的猜想,不一定对,有问题请留言)
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading;
using
System.Data;
namespace
test002
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(new
ThreadStart(delegate()
{
int dataCount = 100;
List<ManualResetEvent>[]
mreListArray = new List<ManualResetEvent>[2];
for (int k = 0; k <
mreListArray.Length; k++)
{
mreListArray[k]
= new List<ManualResetEvent>();
}
DataTable dt = new DataTable("TableName");
int i = 0;
while (i <
dataCount)
{
for (int k = 0; k <
mreListArray.Length; k++)
{
i++;
if (i > dataCount)
goto pos;
dt = new DataTable("TableName");
ManualResetEvent mre =
new ManualResetEvent(false);
mreListArray[k].Add(mre);
Param pra = new Param();
pra.mrEvent = mre;
pra.path = "path";
pra.dt = dt;
pra.i
= i;
ThreadPool.QueueUserWorkItem(ThreadMethod,
pra);
if
(mreListArray[mreListArray.Length - 1].Count == 5)
{
WaitHandle.WaitAll(mreListArray[k].ToArray());
mreListArray[k] = new List<ManualResetEvent>();
}
}
}
pos:
for (int k = 0; k <
mreListArray.Length; k++)
{
if (mreListArray[k].Count
> 0)
{
WaitHandle.WaitAll(mreListArray[k].ToArray());
}
}
Console.WriteLine("Thread Finished!");
}));
thread.Start();
Console.Read();
}
private static void
ThreadMethod(object
obj)
{
Param pra = (Param)obj;
Console.WriteLine("Thread execute at {0}", pra.i);
Thread.Sleep(100000);
pra.mrEvent.Set();
}
}
public class Param
{
public ManualResetEvent mrEvent;
public DataTable dt;
public string path;
public int i;
}
}
加载中,请稍候......