版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuzishang/article/details/85095517
在博客园看到一篇博客 C# -- 使用线程池 ThreadPool 执行多线程任务 在这里使用了线程池 虽然也实现了线程等待 但是线程等待实现的太死板 如果定义未知数量的线程池无法实现等待 ManualResetEvent数量已经定死 所有我在原本代码的基础上做了一些修改
实现代码
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
//定义线程等待事件
ManualResetEvent mre = new ManualResetEvent(false);
//加入集合
manualEvents.Add(mre);
//使用匿名函数加入线程池
ThreadPool.QueueUserWorkItem(
s =>
{
Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
Stopwatch stw = new Stopwatch();
stw.Start();
long result = SumNumbers(10000000);
stw.Stop();
//在这里发送信息 使用匿名函数的好处 不需要把mre传入到方法里 省去一些拆箱和装箱操作
mre.Set();
Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
}, mre);
}
//等待所有信息
WaitHandle.WaitAll(manualEvents.ToArray());
Console.WriteLine("所有线程执行完毕");
Console.ReadKey();
}
执行的方法
static long SumNumbers(int count)
{
long sum = 0;
for (int i = 0; i < count; i++)
{
sum += i;
}
Thread.Sleep(3000);
return sum;
}