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是静态类 所以不需要实例化.
对于线程池主要的控制有控制线程数大小:
参数:
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)
刷新评论刷新页面返回顶部
在多线程的程序中,经常会出现两种情况:
一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应
这一般使用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)
刷新评论刷新页面返回顶部
相关文章推荐
- C#异步编程的实现方式(3)——ThreadPool线程池
- 浅谈C#中常见的委托
- C# bool类型转化为字符串首字母会大写
- C#中制作启动窗体的方法和问题
- [深入学习C#]——IEqualityComparer<T>中GetHashCode的作用
- C#中的ASCII转换
- c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段
- C#学习笔记---Dispose(),Finalize(),SuppressFinalize
- C#调用百度地图API
- C# 5.0将带来的五大新特性
- C#线程操作常见的六大操作方法
- c#使用多线程的几种方式示例详解
- C#三层ATM-13.ATM开户
- C#三层ATM-12.资产查询
- C#三层ATM-11.查看交易信息
- C#三层ATM-10.改密码
- C#三层ATM-9.转账功能设计
- C#三层ATM-8.存款、取款功能设计
- C#三层ATM-7.挂失
- C#三层ATM-6.查询账户基本信息