CountdownEvent handler = new CountdownEvent(100); for (int i = 0; i < 100; i++) { var j = i; ThreadPool.QueueUserWorkItem(_ => { Console.WriteLine("thread " + j); Thread.Sleep(1000); //wait 1 seconds to do something handler.Signal(); }); } handler.Wait(); Console.WriteLine("finished");
谢谢你啊,每次回答问题都有你,你真是太热心了。
我自己的做法是再建立一个子进程来判断线程池内的可用线程数是不是等于最大线程数,循环判断直到相等然后退出输出自己要的结果。你的代码提供了更好的方法。
不过我更新知道如何让线程池自己告诉主程序“我已经全部做完了”,有这种方法吗?
@林J: "再建立一个子进程来判断线程池内的可用线程数是不是等于最大线程数" 不是很稳妥,你想想假设你的同事写了一段代码用线程池运行一个任务,那你岂不是要等他的运行完? handler.Wait() 会阻塞当前线程,直到计数器减到0,不就等于线程池告诉主程序“我已经全部做完了”?任何时候你都可以通过 handler.IsSet 来判断是否全部做完了。
@林J: 另外,如果你再建一个线程,“循环判断直到相等”,你这个循环恐怕是一直死循环直到相等吧?这样浪费CPU的。如果你在循环里sleep,每隔一段时间就去检查是否相等,这样就无法在“第一时间”知道所有线程都执行完成了。
@水牛刀刀: 是的 你说的很对 我再看了一下别人的ThreadPool的RegisterWaitForSingleObject方法,这里其实也是变相地靠监视两个变量来决定何时执行完毕。c#的线程池貌似没有回调函数说明何时执行完毕了
学习下,是懂非懂=不懂
加入以下,这个时候我们有一个计数变量
你开启了100个线程
假设现在主线程等待他们的完成,每个线程最后的代码就是修改上面的计数
>=100的时候,就算开启的子线程都完成了
你说的和一楼带代码思路一样,感谢,是我想复杂了,不过我想让线程池主动告诉主线程自己已经做完全部了,有这种方法吗
@林J: 那你也应该有一个地方收集的啊,100个线程,随时随机都有完成的,也不能保证这个线程就是最后一个完成的
@chenping2008: 我的意思是线程池内所有线程都执行完毕了,执行一个回调函数告诉主线程。貌似没有这种方法,谢谢了,不在这个问题上纠结了。