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

DeltaCat 2008-06-11 07:56:58
多线程,没什么经验,请大家多指教。

问题描述如下:

一个WINFORM的应用,在主程序启动后, 会启动N个子线程,形如:

static void main(){

Thread t1 = new Thread (new ThreadStart(Entity1.doWork));

Thread t2 = new Thread (new ThreadStart(Entity2.doWork));

......

Thread tN = new Thread (new ThreadStart(EntityN.doWork));

}

,然后呢,每个 EntityX.doWork 的逻辑中, 又启动了N个子线程,形如:

public class EntityX{

public static void doWork(){

Thread t1 = new Thread (new ThreadStart(Sample1.go));

Thread t2 = new Thread (new ThreadStart(Sample2.go));

......

Thread tN = new Thread (new ThreadStart(SampleN.go));

}

}



现在的问题是: 需要在主程序中,对所有的子线程(子的子)进行生命周期的管理,请教各位有没有好的方案,我自己目前的实现思路是用 timer + thread 数组的轮询方式来做,不过感觉不是很好,希望大家不吝赐教。

针对我要实现的模式, 如果哪位有更好的实现逻辑,也请不吝赐教,先谢谢。

...全文
489 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzxlyl123 2012-09-24
  • 打赏
  • 举报
回复
楼主使用什么方式解决的,求解
ep_wolfliao 2012-02-03
  • 打赏
  • 举报
回复
学习,怎么好像没有结果呢
DeltaCat 2008-07-29
  • 打赏
  • 举报
回复
换了实现方式,多谢大家参与。
hailiangcun 2008-06-12
  • 打赏
  • 举报
回复
路过学习
maxis585 2008-06-12
  • 打赏
  • 举报
回复
我看给每一个线程都搞上一个事件(比如一个条件触发,时间触发),自己管理自己就不会乱了吗?主线程在搞上一个判断句就行了,应该是这样的?
fuadam 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 greystar 的回复:]
http://blog.csdn.net/greystar/archive/2007/08/31/1766363.aspx
建议使用这个来实现
[/Quote]
============================================
线程池这种东西如果访问量还想,假设楼主这个东西是用在服务器端接受很多客户端查询,线程池总有最大上限吧,就和tcpserver一样,出率效率太低
pe472889832pe 2008-06-12
  • 打赏
  • 举报
回复
学习!
jimh 2008-06-12
  • 打赏
  • 举报
回复
最好不使用轮询的方式,可以用事件,当线程结束或其他动作,发一个事件通知父线程,父线程就可以处理相关动作,不需要轮询操作的。
net0003 2008-06-12
  • 打赏
  • 举报
回复
帮顶个吧
greystar 2008-06-12
  • 打赏
  • 举报
回复
http://blog.csdn.net/greystar/archive/2007/08/31/1766363.aspx
建议使用这个来实现
zhnzzy 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alexzhang00 的回复:]
逻辑和数据库操作是溶于一体的。

子逻辑需要父逻辑的执行结果来作为前提条件,也就是作为参数传入的(我的多线程是带启动参数的,是 ParameterizedThreadStart 模式)
[/Quote]
那就用委托吧!
hailiangcun 2008-06-12
  • 打赏
  • 举报
回复
著名.Net培训公司软件工程师培训课程内容(完整课程视频共35G)
第一阶段教学内容安排(200课时)
课程名称 课程内容 培训目的
C# 编程方法和编程技巧、面向对象的思想、数据结构和算法以及设计模式(120课时) 详细介绍.Net Framework、C# 语法、编程方法、编程技巧。深入理解和学习面向对象的思想和方法,学会用面向对象的方法去认识问题、分析问题和解决问题,学习数据结构和常用算法,学习MVC模式、单件模式、适配器模式、工厂模式、观察者模式等设计模式。 深入了解.Net FrameWork、掌握C#语法、编程方法和编程技巧,掌握数据结构、常用算法和面向对象的思想。
针对循环、数组、类的概念、类的构建、类的使用、对象的创建、面向对象的思想、集合、常用算法、IO操作、泛型、反射、委托、迭代器等知识点先后完成如下项目:1。通讯录系统;2。列车售票系统;3。教学管理系统。 通过实际项目深入理解和掌握C# 编程、面向对象的思想、类的概念和使用、对象的创建、算法、IO操作等
数据库知识和 SQL Server 2000 (40课时) 讲授数据库的基本知识和SQL Server 2000, 讲授数据库的设计和优化,学习T-SQL 和数据库编程,学习存储过程(stored procedure)、触发机制(trigger)和索引(index). 掌握 SQL Server 2000, 学会数据库编程, 掌握T-SQL, Stored Procedure, Trigger, index.
C# 高级编程I
(40课时) 系统地讲授多线程的基本概念和使用、线程的设计、线程的优先级;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、流的概念、文件的操作和程序集的相关概念,学习反射和属性以及动态定义类型和方法。
第二阶段教学内容安排(400课时)
课程名称 课程内容 培训目的
ASP.Net2.0、ADO.Net2.0和Web 应用程序
(160课时) 系统讲授 ASP.Net2.0、ADO.Net2.0、 基于数据库的WEB应用程序的开发;讲授母版页、Web Part技术、站点导航、数据元对象、Asp.Net缓冲技术、和Asp.Net的安全机制;讲授用户控件和第三方控件的开发和使用;讲授Web Service及其应用和相关的安全性问题、WSE、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。学习HTML、XML、JavaScript、水晶报表(Crystal Report)和IIS 基础以及WEB应用程序性能优化;学习Ajax、Web2.0的相关技术。
熟练掌握基于数据库的Web应用程序和Web服务的开发技术;掌握第三方控件技术和报表技术;掌握Ajax、Web2.0技术;学会操作和处理XML,等等.
针对ASP.Net2.0、ADO.Net2.0、Web服务、HTML、XML、JavaScript、水晶报表(Crystal Report)、Ajax、Web2.0等知识点先后完成如下项目:1。基于Web的远程文件管理系统(Remote File Management System);2。在线咨询系统;3。论坛系统 通过实际项目深入理解和掌握Web开发技术,包括:Asp.Net、Ajax、XML、 Ado.Net、Web Service、Crystal Report 等。

Windows 应用程序、设计模式和Oracle数据库编程(40课时) 系统地讲授Windows应用程序的开发,学习观察者模式和Oracle数据库编程。 熟练开发基于数据库的Windows应用程序,掌握Oracle数据库编程。
C# 高级编程II
(40课时) 详细讲授DNS开发、套接字(Socket)编程、TCP、UDP 编程、消息队列(MSMQ)及其编程;详细讲授远程处理(Remoting)技术,包括基本远程处理框架,配置文件及其应用, 异步远程处理技术,租约和生存期控制;系统地讲授Windows服务编程、Com+ 服务、WSE2.0的使用。进一步讲解进程、线程和应用程序域,讲解多线程的使用、临界区域的概念、序列化、属性和反射技术。深入学习InterNet Access 技术和正则表达式技术。 掌握 Socket 编程、TCP、 UDP编程、远程处理(Remoting)技术、Windows服务编程;Com+ 服务、WSE2.0、InterNet Access和正则表达式技术等。
OOAD¨
(24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具.
项目实习
(120课时) 在培训老师的指导下完成如下项目:
(1) 基于套接字(Socket)的 C/S 结构的在线咨询系统。
(2) 基于Windows Form和正则表达式技术的职位搜索器。
(3) 电子商务软件项目:” Prepaid Phone Card Online Sales System”。内容包括:Application Architecture Analysis、Creating the Data Model、Design Database Schema、Programming Stored procedures、Web Application Design、App Setting、 Log in Design、 Security、 Authentication、Authorization、 Navigation Bar、Shopping Cart、Cross-Brower Support、Performance.
通过实际项目, 培养学生实战能力,包括系统分析、设计(包括功能需求分析、数据库设计、功能模块设计和详细设计)、开发、调试、测试和部署的能力。

需要这个培训视频的朋友请联系 QQ 9 3 6 6 5 2 1 1 4
家鸣 2008-06-12
  • 打赏
  • 举报
回复
用委托应该可以,当线程内部有主程序感兴趣的事件发生时,通过委托,通知主程序。变主动为被动模式,这样处理起来简单些。
九章落地 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 alexzhang00 的回复:]
实际上,每个逻辑,都涉及到数据库操作,是为了充分利用数据库的并发连接数,所以才有此想法的
[/Quote]

我有个疑问,想请教楼主:
正常情况下,每次连接数据库时,都会通过Sqlconnection con=new SqlConnection()新建一个链接,自然已形成并发连接数据库了啊,有必要用多个子线程吗?
wenbin 2008-06-12
  • 打赏
  • 举报
回复
具体逻辑不知
不过感觉后面的可以线程池做
huheng_0_0 2008-06-12
  • 打赏
  • 举报
回复
学习
优途科技 2008-06-12
  • 打赏
  • 举报
回复
个人觉得楼上的比较科学。

主逻辑监听线程:mlistener
子逻辑监听线程; slistener
数据库查询工作相称: dbworker

mlistener得到要执行的主逻辑然后通知dbworker查询。在dbworker查询的时候,mlistener继续监听对主逻辑的请求

dbworker的到查询结后通知slistener来处理相应的子逻辑,slistener通知dbworker进行查询。slistener继续坚挺对子逻辑的请求。dbworker得到查询结构后继续操作

我这个有点像对tcpserver的操作。这种方法比用线程池的方法效率高
DeltaCat 2008-06-12
  • 打赏
  • 举报
回复
没有人有其他的看法吗?
wengyuli 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fuadam 的回复:]
我觉得你可以这样做
主逻辑监听线程:mlistener
子逻辑监听线程; slistener
数据库查询工作相称: dbworker

mlistener得到要执行的主逻辑然后通知dbworker查询。在dbworker查询的时候,mlistener继续监听对主逻辑的请求

dbworker的到查询结后通知slistener来处理相应的子逻辑,slistener通知dbworker进行查询。slistener继续坚挺对子逻辑的请求。dbworker得到查询结构后继续操作

我这个有点像对tcpserver的操作…
[/Quote]
fuadam 2008-06-12
  • 打赏
  • 举报
回复
前台线程,这是什么概念。不能用.net自带的线程池,就自己写一个
加载更多回复(16)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧