您的位置:首页 > 编程语言 > C#

C#多线程学习 之 线程池[ThreadPool]

2016-06-06 16:23 363 查看
C#多线程学习 之 线程池[ThreadPool]

在多线程的程序中,经常会出现两种情况:

一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应

                  这一般使用ThreadPool(线程池)来解决;

另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒

                  这一般使用Timer(定时器)来解决;

本篇文章单单讲线程池[ThreadPool]

ThreadPool类 MSDN帮助信息: http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool.aspx#Y0
将任务添加进线程池:

ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));

重载

ThreadPool.QueueUserWorkItem(new WaitCallback(方法名), 参数);

因为ThreadPool是静态类 所以不需要实例化.

 

对于线程池主要的控制有控制线程数大小:

ThreadPool.SetMaxThreads 方法

public static bool SetMaxThreads(
int workerThreads,
int completionPortThreads
)

参数:

workerThreads类型:System.Int32

线程池中辅助线程的最大数目。completionPortThreads类型:System.Int32

线程池中异步 I/O 线程的最大数目。例子:

?
输出结果:





您会发现 断点测试 在上面了, 这是什么原因呢?

原因:

1. 线程池的启动和终止不是我们程序所能控制的, 我反正是不知道的, 你如果知道的话 可以发邮件给我
henw@163.com

2. 线程池中的线程执行完之后是没有返回值的.

总之一句话, 我们不知道线程池他干了什么, 那么我们该怎么解决 任务完成问题呢?

操作系统提供了一种”信号灯”(ManualResetEvent)

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent
将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

详细见MSDN: http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx
主要使用了

eventX.WaitOne(Timeout.Infinite, true);  阻止当前线程,直到当前 WaitHandle 收到信号为止。

eventX.Set(); 将事件状态设置为终止状态,允许一个或多个等待线程继续。

修改后的程序:

?
输出结果:





顺序正常了.

程序源码:
多线程池试验.zip

欢迎大家一起探讨!

分类:
.Net

好文要顶
关注我
收藏该文联系我








hen
关注 - 5
粉丝 - 167

+加关注

6
1

(请您对文章做出评价)

«
上一篇:电脑方面的技巧
»
下一篇:C# 配置文件读取与修改

posted @ 2012-01-06 16:43
hen 阅读(25534) 评论(7)

编辑
收藏

评论列表

  
#1楼
2012-01-06 17:53
红涛
 

mark下
支持(0)反对(0)

  
#2楼
2012-01-06 23:14
L.Qiu
 

不错,要理解得更深刻一些,看来还需要一些操作系统中断方面的知识
支持(0)反对(0)

  
#3楼
2013-08-01 21:56
weblogical
 

博主,http://q.cnblogs.com/q/53015/ 这个问题 用线程池怎么实现呢?
支持(0)反对(0)

  
#4楼
2014-09-19 11:13
逢雨不出门
 

请教,使用你这种方法之后,增长了很多内存,该如何清理掉这些内存呢
支持(0)反对(0)

  
#5楼
2015-01-13 10:48
洗刷界的无头程序员
 

使用了随机睡眠时间长度(模拟方法运行时间变化)后,会出现未完成就退出了。这改怎么办呢。
支持(0)反对(0)

  
#6楼[楼主]
2015-01-16 21:29
hen
 

@Arvin Li

有个方法可以等待所有线程运行结束之后再执行下面的方法
支持(0)反对(0) http://pic.cnblogs.com/face/u139930.jpg?id=14082947
  
#7楼32988182015/11/4
13:40:43 2015-11-04 13:40
^清小怨
 


支持(0)反对(0)

刷新评论刷新页面返回顶部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: