首页 新闻 会员 周边 捐助

有关.NET多线程的控制问题

0
悬赏园豆:5 [待解决问题]

我现在在做一个有关数据计算的算法,由于数据比较大,我采用了多线程来进行跑数据,由于是按照日期进行跑的,我把日期集合每15天归为一组,对日期组进行集合遍历,每次执行50个线程,

 //Lst_DateTimeList 每15天一组的日期集合
foreach (List<DateTime> item in Lst_DateTimeList)
     {
           //逻辑计算的参数
                    List<object> Lst_Obj = new List<object>() { mre, item };
//开启线程  IncrementSectionDate 方法是执行数据的计算以及数据的入库
                    Thread td = new Thread(new ParameterizedThreadStart(IncrementSectionDate));
                    td.Start(Lst_Obj);
//开启的线程集合
                    Lst_Thread.Add(td);
             //线程50个数量的控制
                    while (Lst_Thread.Count >= 50)
                    {

                        Lst_Thread = Lst_Thread.Except(Lst_Thread.Where(r => r.IsAlive == false).ToList()).ToList();
                        Thread.Sleep(1000);
                    }
                    k++;
                }

我现在想在线程执行完后执行一些操作,我该怎么来判断多线程中的线程是否执行完成?

问题补充:
        while (Lst_Thread.Where(r => r.IsAlive == false).Count() >= 50)
                {
                    //执行一些方法
                }

 

我现在采用 上面这种方式,不知道有上面更好的方式来进行控制呢?

飞蛾扑火的主页 飞蛾扑火 | 初学一级 | 园豆:145
提问于:2013-01-14 10:16
< >
分享
所有回答(2)
0

请参考:http://www.cnblogs.com/heyuquan/archive/2012/12/16/2820775.html

判断多个线程是否都结束的几种方法

有园友问到此问题,所以提供下面几种方法。若还有其他方法请告知。

  1. 线程计数器

      线程也可以采用计数器的方法,即为所有需要监视的线程设一个线程计数器,每开始一个线程,在线程的执行方法中为这个计数器加1,如果某个线程结束(在线程执行方法的最后),为这个计数器减1。使用这种方法需要使用原子操作(eg:Volatile、InterLocked)同步这个计数器变量。

  1. 使用Thread.join方法

join方法只有在线程结束时才继续执行下面的语句。可以对每一个线程调用它的join方法,但要注意,这个调用要在一个专门线程里做,而不要在主线程,否则程序会被阻塞。

  1. 轮询Thread的IsAlive属性

     IsAlive判断此线程是否还存活。经测试只有 Unstarted、Stopped 返回false;其他线程状态都返回true。

     我们通过轮询检查此属性来判断线程是否结束。但要注意,这个调用要在一个专门线程里做,而不要在主线程,否则程序会被阻塞。

          EG:while(true) { foreach(多个线程){ if(thread1.IsAlive) { } } }

  1. 使用回调函数进行通知

请参考“线程Thread类详解”节第二点示例

  1. 使用同步基元对象

     Eg:WaitHandle。在后续章节中再说明

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-14 10:52
0

写个事件,每次线程执行完触发事件,当事件被触发的次数等于总共开启的线程数就是全部执行完了

RyanCheng | 园豆:474 (菜鸟二级) | 2013-01-15 08:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册