首页 新闻 会员 周边

关于.NET多线程嵌套的管理问题

0
悬赏园豆:100 [已关闭问题]
<P><FONT size=2>问题描述如下:</FONT></P> <P><FONT size=2>一个WINFORM的应用,在主程序启动后, 会启动N个子线程,形如:</FONT></P> <P><FONT size=2>static void&nbsp;main(){&nbsp;</FONT></P> <P><FONT size=2>Thread t1 = new Thread (new ThreadStart(Entity1.doWork));</FONT></P> <P><FONT size=2>Thread t2 = new Thread (new ThreadStart(Entity2.doWork));</FONT></P> <P><FONT size=2>......</FONT></P> <P><FONT size=2>Thread tN = new Thread (new ThreadStart(EntityN.doWork));</FONT></P> <P><FONT size=2>}</FONT></P> <P><FONT size=2>,然后呢,每个 EntityX.doWork 的逻辑中, 又启动了N个子线程,形如:</FONT></P> <P><FONT size=2>public class EntityX{</FONT></P> <P><FONT size=2>&nbsp;&nbsp;&nbsp; public static void doWork(){</FONT><FONT size=2>&nbsp;</P> <P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread t1 = new Thread (new ThreadStart(Sample1.go));</FONT></P> <P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread t2 = new Thread (new ThreadStart(Sample2.go));</FONT></P> <P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</FONT></P> <P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread tN = new Thread (new ThreadStart(SampleN.go));</FONT></P> <P>&nbsp;&nbsp;&nbsp; }</P> <P>}</P> <P>&nbsp;</P> <P>现在的问题是: 需要在主程序中,对所有的子线程(子的子)进行生命周期的管理,请教各位有没有好的方案,我自己目前的实现思路是用 timer + thread 数组的轮询方式来做,不过感觉不是很好,希望大家不吝赐教。</P> <P>针对我要实现的模式, 如果哪位有更好的实现逻辑,也请不吝赐教,先谢谢。</P></FONT>
问题补充: 是这样的,我的这些线程是前台线程; 对共享资源的访问,均为 只读访问 对线程的管理,是因为可能需要中途终止线程的执行。
三角猫的主页 三角猫 | 初学一级 | 园豆:105
提问于:2008-06-11 19:46
< >
分享
其他回答(2)
0
"对所有的子线程(子的子)进行生命周期的管理"请详细描述一下这句话的意思。 WaitHandle或许能帮你解决一些问题,请参考: http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx
玉开 | 园豆:8822 (大侠五级) | 2008-06-12 08:43
0
不知道你的管理所有线程的生命周期是什么意思?你遇到了什么问题?是线程太多,资源损耗太大?还是,发生了资源竞争? 如果是线程太多,造成很大的资源浪费(线程其实会消耗很多资源,过多的线程对性能有害),可以使用System.Threading.ThreadPool来管理。这个对象会自动对你希望启动的线程进行排队,并且复用已有的线程资源。可以设置同时并发线程最大数量等。(如果你使用了ThreadStaticAttribute,可能需要注意下线程复用造成的问题,我没有测试过。) 如果是资源竞争,可以使用楼上的介绍。 另外,关于结束线程,可以为每个线程定义一个信号量,使用这个信号量通知线程结束自己,线程的执行循环在每个任务片完成后检查信号并决定是否结束自己。 这样做要优于主线程去调Thread.Abort方法。这样可以保证工作线程完成了一个完整的任务片,不会遗留下错误的状态。 -------------------------------------------- 补充:2008/06/13 两个问题: 你所说的前台线程是指什么?是包含UI的线程吗? 你目前的Timer是怎么实现的?在调用Tread.Abort吗? 如果你的线程包含Form,可以直接使用Control.Invork方法,在Form所在线程中执行特定的代码。以实现结束线程。 另外,我不觉得UI需要使用多线程,大多数情况下,我会把一些很长的业务逻辑的执行放在一个工作线程中执行。所有的Form都会放在主线程中执行。这样可以有效的分离展示和业务逻辑,并且性能应该会更好。
Colin Han | 园豆:3041 (老鸟四级) | 2008-06-12 13:49
0
shoucang
Jared.Nie | 园豆:1940 (小虾三级) | 2008-06-13 14:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册