首页 新闻 会员 周边

如何判断线程池里的线程全部执行完毕

0
悬赏园豆:15 [已解决问题] 解决于 2012-10-12 14:39

网上找了很多资料都找不到重点。现在的需求是这样的,建一个容量为10的线程池,放入100个线程,开始执行,主程序需要在线程池里的线程全部执行完毕后得到回应。委托里可以用BeginInvoe的一个IAsyncResut对象的IsComplete属性来普单,但是线程池我就不知道了。网上都说使用线程池的RegisterWaitForSingleObject方法注册一个句柄,通过判断线程池的可工作线程和最大线程来决定什么时候注销掉这个句柄,这个又要用在什么地方呢?再建立一个子线程来判断?

林J的主页 林J | 菜鸟二级 | 园豆:202
提问于:2012-10-12 13:38
< >
分享
最佳答案
0
            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");
收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-10-12 14:11

谢谢你啊,每次回答问题都有你,你真是太热心了。

我自己的做法是再建立一个子进程来判断线程池内的可用线程数是不是等于最大线程数,循环判断直到相等然后退出输出自己要的结果。你的代码提供了更好的方法。

不过我更新知道如何让线程池自己告诉主程序“我已经全部做完了”,有这种方法吗?

林J | 园豆:202 (菜鸟二级) | 2012-10-12 14:20

@林J: "再建立一个子进程来判断线程池内的可用线程数是不是等于最大线程数" 不是很稳妥,你想想假设你的同事写了一段代码用线程池运行一个任务,那你岂不是要等他的运行完? handler.Wait() 会阻塞当前线程,直到计数器减到0,不就等于线程池告诉主程序“我已经全部做完了”?任何时候你都可以通过 handler.IsSet 来判断是否全部做完了。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-10-12 14:25

@林J: 另外,如果你再建一个线程,“循环判断直到相等”,你这个循环恐怕是一直死循环直到相等吧?这样浪费CPU的。如果你在循环里sleep,每隔一段时间就去检查是否相等,这样就无法在“第一时间”知道所有线程都执行完成了。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-10-12 14:28

@水牛刀刀: 是的 你说的很对 我再看了一下别人的ThreadPool的RegisterWaitForSingleObject方法,这里其实也是变相地靠监视两个变量来决定何时执行完毕。c#的线程池貌似没有回调函数说明何时执行完毕了

林J | 园豆:202 (菜鸟二级) | 2012-10-12 14:37
其他回答(2)
0

学习下,是懂非懂=不懂

念念啊 | 园豆:415 (菜鸟二级) | 2012-10-12 14:19
0

加入以下,这个时候我们有一个计数变量

你开启了100个线程

假设现在主线程等待他们的完成,每个线程最后的代码就是修改上面的计数

>=100的时候,就算开启的子线程都完成了

收获园豆:5
chenping2008 | 园豆:9836 (大侠五级) | 2012-10-12 14:21

你说的和一楼带代码思路一样,感谢,是我想复杂了,不过我想让线程池主动告诉主线程自己已经做完全部了,有这种方法吗

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2012-10-12 14:22

@林J: 那你也应该有一个地方收集的啊,100个线程,随时随机都有完成的,也不能保证这个线程就是最后一个完成的

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-10-12 14:25

@chenping2008: 我的意思是线程池内所有线程都执行完毕了,执行一个回调函数告诉主线程。貌似没有这种方法,谢谢了,不在这个问题上纠结了。

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2012-10-12 14:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册