首页 新闻 会员 周边

【C#多线程问题】动态开启的线程全部执行完成时,主线程如何得到通知?

0
悬赏园豆:50 [已解决问题] 解决于 2015-09-27 14:50

比如我多线程下载一个文件,每个线程下载其中的一段数据流,所有线程下载完成后把这些数据流合并成一个完整的文件。

那么问题来了,我如何判断这几个线程全部执行结束了?

CodeOddity的主页 CodeOddity | 初学一级 | 园豆:167
提问于:2015-07-18 21:53
< >
分享
最佳答案
1

是啊.现在的异步模型可以直接用waitall或者.ContinueWith就可以了

吴瑞祥 | 高人七级 |园豆:29449 | 2015-07-20 11:20
其他回答(7)
0

线程完了有事件的啊,你不会连自己开了多少线程都没记录吧?

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-07-18 22:12

开了多少线程是动态分配的,单个线程完了的确有事件,但我想要所有线程都执行完的那个事件呀?莫非只能另开一个线程不断检测这些子线程的状态

支持(0) 反对(0) CodeOddity | 园豆:167 (初学一级) | 2015-07-18 22:18

@卞新欢: 你找本NET4.5的书看看吧,有惊喜的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2015-07-18 22:50
0

你可以到 http://www.foundexception.com/ 易为网上提问,很多高手回答。

刘珍宝 | 园豆:289 (菜鸟二级) | 2015-07-19 00:00
0

计数器,每个线程完毕的事件中,操作计数器,当计数器 == 线程总数的时候,就ok了。。

幻天芒 | 园豆:37175 (高人七级) | 2015-07-19 20:59
0

可以使用公共变量,也可以使用回调函数

ching126 | 园豆:228 (菜鸟二级) | 2015-07-20 08:23
1

 Semaphore 搜索下这个类。

 我之前处理这个问题的思路是,我用 Semaphore 初始化10个资源,开启10个线程,每个线程结束后,就关闭一个资源。主线程会在开始线程之后,开始不停的占用资源。大致代码如下:

 Semaphore sem = new Semaphore(0, 10, "cnblogs");
 for(var i=0;i<100;i++)
 {
    //申请资源
    sem.WaitOne();
    //开启线程
    ThreadPool.QueueUserWorkItem(new WaitCallback( obj=>{
        //...执行对应的逻辑
        //释放资源
        sem.Release();
    }));
 }
 //主线程必须保证子线程全部OK
 for (var i=0; i<10;i++)
 {
    //因为初始化了10个资源,所以主线程就把10个资源都抢过来
    sem.WaitOne();//当资源不足的时候,代码会卡在这里,等待。
 }
 //子线程全部消亡后 就可以做你想做的事了
 
冲动 | 园豆:394 (菜鸟二级) | 2015-07-20 09:25
0

用 

System.Threading.Tasks.Task.WaitAll() 应该可以满足你的需求
收获园豆:50
zhengldg | 园豆:462 (菜鸟二级) | 2015-07-20 09:40
0

join

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2015-07-21 14:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册