日期:2014-05-17  浏览次数:20982 次

c# 主线程等待子线程结束,以及获取子线程执行的结果
   有几个子线程在执行,给每个线程传一个链表,执行完后每个线程会返回一个新链表,主线程需要统计这几个线程返回的链表,然后连接成一个新的链表。
   我现在的做法是:设置一个全局的链表和一个全局的计数count(子线程的数目),每个线程执行完后把结果加到全局链表上,然后count--,主线程一直while循环等待count=0,然后执行下面的操作,, ,,,
    现在问题是,感觉主线程while循环,这样效率很低,有没有其他方式解决?比如什么异步回调(我不会),还有主线程等待子线程全部结束的主动触发,而不是被动等待? 还有这个全局链表会被同时操作,运行有时会报错,,,有什么好的解决方法么? 
   谢谢各位,

------解决方案--------------------
用while不可取,除了占用资源以外也不太可靠,用全局变量保存处理的每个子线程完成再累计count,需要加锁.(但仍然不能实现多个实例)
可用另外一种思路解决.仅供参考:
建立一个主对象,有发出的线程数(分配线程时确定,并在分配时确定每个线程Guid)、已完成的线程数(初始为0)、异常的线程数(初始为0)、以及回调事件、
待处理的链表集合(应含有Guid值)等。每个子线程完成时都会触发一个完成事件或异常事件,主对象捕获这个事件,并比对Guid,并且将已完成的线程数累计(累计时需加锁该属性)以及获取该线程返回的新表,将保存到主对象中,当累计数与分配数相等时,则合并,并由主线程进行后继操作。就不需要while,并且可用多个实例。
------解决方案--------------------
使用信号量
多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
http://www.cnblogs.com/luminji/archive/2010/09/17/1829360.html

话说回来,现在应该使用Task而不是Thread.
Task天然支持完成通知
------解决方案--------------------
给你写了点参考代码

我觉得学会两个东西就行了 Thread.Join() 和 lock


        static Random _random = new Random();
        static void Main(string[] args)
        {
            ArrayList listThread = new ArrayList();
            ArrayList listResult = new ArrayList();
            for (int i = 0; i < 10; i++)
            {
                Thread thread = new Thread(new ParameterizedThreadStart(WorkThread));
                thread.Start(listResult);
                listThread.Add(thread);
            }

            foreach (Thread thread in listThread)
            {
                thread.Join();
            }

            foreach (int i in listResult)
            {
                Console.WriteLine(i);
            }
        }

        static void&nbs