读书人

c# 主线程等候子线程结束以及获取子

发布时间: 2013-10-11 14:52:39 作者: rapoo

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 WorkThread(object list)
{
int cnt = _random.Next(1,10);
ArrayList listLocal = new ArrayList();
for (int i = 0; i < cnt; i++)
{
listLocal.Add(cnt);
Thread.Sleep(100);
}

lock (list)
{
(list as ArrayList).AddRange(listLocal);
}
}

读书人网 >C#

热点推荐