好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

线程池[ThreadPool]

线程池[ThreadPool]

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 线程的最大数目。

例子:

?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace 多线程池试验

{

     class Program

     {

         public static void Main()

         {

             ThreadPool.SetMaxThreads(3, 3);

             for ( int i = 0; i < 50; i++)

             {

                 thr t = new thr();

                 ThreadPool.QueueUserWorkItem( new WaitCallback(t.ThreadProc), i);

             }

             Console.WriteLine( "断点测试" );

             Thread.Sleep(100000);

 

             Console.WriteLine( "运行结束" );

         }

 

         public class thr

         {

             public void ThreadProc( object i)

             {

                 Console.WriteLine( "Thread[" + i.ToString() + "]" );

                 Thread.Sleep(1000);

             }

         }

     }

}

输出结果:

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

原因:

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(); 将事件状态设置为终止状态,允许一个或多个等待线程继续。

修改后的程序:

?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace 多线程池试验

{

     class Program

     {

         public static void Main()

         {

             //新建ManualResetEvent对象并且初始化为无信号状态

             ManualResetEvent eventX = new ManualResetEvent( false );

             ThreadPool.SetMaxThreads(3, 3);

             thr t = new thr(15, eventX);

             for ( int i = 0; i < 15; i++)

             {

                 ThreadPool.QueueUserWorkItem( new WaitCallback(t.ThreadProc), i);

             }

             //等待事件的完成,即线程调用ManualResetEvent.Set()方法

             //eventX.WaitOne  阻止当前线程,直到当前 WaitHandle 收到信号为止。

             eventX.WaitOne(Timeout.Infinite, true );

             Console.WriteLine( "断点测试" );

             Thread.Sleep(10000);

             Console.WriteLine( "运行结束" );

         }

 

         public class thr

         {

             public thr( int count,ManualResetEvent mre)

             {

                 iMaxCount = count;

                 eventX = mre;

             }

 

             public static int iCount = 0;

             public static int iMaxCount = 0;

             public ManualResetEvent eventX;

             public void ThreadProc( object i)

             {

                 Console.WriteLine( "Thread[" + i.ToString() + "]" );

                 Thread.Sleep(2000);

                 //Interlocked.Increment()操作是一个原子操作,作用是:iCount++ 具体请看下面说明

                 //原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。

                 //由于操作系统大部分时间处于开中断状态,

                 //所以,一个程序在执行的时候可能被优先级更高的线程中断。

                 //而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。

                 //就是不能被中断的操作。

                 Interlocked.Increment( ref iCount);

                 if (iCount == iMaxCount)

                 {

                     Console.WriteLine( "发出结束信号!" );

                     //将事件状态设置为终止状态,允许一个或多个等待线程继续。

                     eventX.Set();

                 }

             }

         }

     }

}

输出结果:

顺序正常了.

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

欢迎大家一起探讨!

分类:  .Net

.Net

 

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

 

posted @  2012-01-06 16:43  hen 阅读(1082) |  评论 (2)   编辑

 

关于Json的那点事

 

posted @  2011-12-16 18:23  hen 阅读(147) |  评论 (0)   编辑

 

ASP.NET导航,自定义数据源绑定[sitemap文件]

 

posted @  2011-12-04 16:48  hen 阅读(172) |  评论 (0)   编辑

 

C#配置文件读取 - ConfigurationManager.AppSettings

 

posted @  2011-11-30 10:51  hen 阅读(76) |  评论 (0)   编辑

 

ASP.NET [C#]正则表达式

 

posted @  2011-11-16 13:22  hen 阅读(13) |  评论 (0)   编辑

 

ASCII码对照表

 

posted @  2011-11-10 13:42  hen 阅读(10) |  评论 (0)   编辑

 

js Html结构转字符串形式显示

 

posted @  2011-11-09 09:28  hen 阅读(125) |  评论 (0)   编辑

 

.aspx 页面引用命名空间

 

posted @  2011-11-04 14:12  hen 阅读(363) |  评论 (0)   编辑

 

asp.net inc 的使用

 

posted @  2011-10-26 10:29  hen 阅读(182) |  评论 (0)   编辑

 

Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法

 

posted @  2011-10-13 10:12  hen 阅读(1041) |  评论 (0)   编辑

 

DLL反编译,DLL反编译成C#代码, 有些不良同学会用到哦!

 

posted @  2011-10-12 10:53  hen 阅读(101) |  评论 (0)   编辑

 

json的使用 前后台统一以对象的方式编程

 

posted @  2011-10-09 14:02  hen 阅读(1670) |  评论 (7)   编辑

 

配置文件 值的写入和读取

 

posted @  2011-10-08 15:48  hen 阅读(255) |  评论 (6)   编辑

 

Asp.net(C#) windows 服务{用于实现计划任务,事件监控等}

 

posted @  2011-09-29 18:10  hen 阅读(1623) |  评论 (19)   编辑

 

C#序列化

 

posted @  2011-09-27 14:54  hen 阅读(245) |  评论 (0)   编辑

 

C# 队列 栈

 

posted @  2011-09-26 09:26  hen 阅读(234) |  评论 (0)   编辑

 

C#(ASP.net)从其他网站抓取内容并截取有用信息

 

posted @  2011-09-23 16:40  hen 阅读(887) |  评论 (11)   编辑

 

ASP.NET 计划任务(不使用外接程序,.net内部机制实现)

 

posted @  2011-09-23 15:02  hen 阅读(398) |  评论 (0)   编辑

 

获取当前类得位置以及方法名

 

posted @  2011-09-22 13:34  hen 阅读(46) |  评论 (0)   编辑

 

C# 程序执行时间查看, 效率查看

 

posted @  2011-09-14 15:23  hen 阅读(41) |  评论 (0)   编辑

 

类类似数组一样输出

 

posted @  2011-08-08 09:08  hen 阅读(53) |  评论 (0)   编辑

 

常用JS,C#正则表达式大汇总.

 

posted @  2011-07-25 16:24  hen 阅读(46) |  评论 (0)   编辑

 

asp.net(C#) Excel导出类 导出.xls文件

 

posted @  2011-07-11 17:31  hen 阅读(330) |  评论 (0)   编辑

 

Visual Studio快捷键 [VS2008/VS2005]快捷键

 

posted @  2011-07-08 08:56  hen 阅读(759) |  评论 (0)   编辑

 

Cookie乱码解决方法

 

posted @  2011-07-07 14:00  hen 阅读(83) |  评论 (0)   编辑

 

C# 技巧,常识

 

posted @  2011-07-07 13:37  hen 阅读(53) |  评论 (0)   编辑

 

asp.net 后台向前台注册JS脚本

 

posted @  2011-07-06 13:56  hen 阅读(185) |  评论 (0)   编辑

 

C#常用字符格式判断

 

posted @  2011-06-30 10:50  hen 阅读(133) |  评论 (0)   编辑

 

C#:rdlc - 报表实例

 

posted @  2011-06-27 10:03  hen 阅读(192) |  评论 (0)   编辑

 

TreeView 树形控件 - asp.net

 

posted @  2011-06-27 09:28  hen 阅读(290) |  评论 (0)   编辑

 

asp.net: RDLC 报表

 

posted @  2011-06-24 15:57  hen 阅读(132) |  评论 (2)   编辑

 

C#, JS, HTML - 转义字符

 

posted @  2011-06-23 10:10  hen 阅读(443) |  评论 (0)   编辑

 

必须写闭合标签

 

posted @  2011-06-21 09:10  hen 阅读(106) |  评论 (0)   编辑

 

vs“当前不会命中断点 还没有为该文档加载任何符号”解决方法

 

posted @  2011-06-20 13:12  hen 阅读(537) |  评论 (2)   编辑

 

Repeater中使用Button

 

posted @  2011-06-13 22:29  hen 阅读(183) |  评论 (0)   编辑

 

在Repeater 中使用Repeater的方法, Repeater2 内嵌 Repeater1操作

 

posted @  2011-06-13 22:27  hen 阅读(146) |  评论 (0)   编辑

 

简化: ASP.NET 事件触发顺序

 

posted @  2011-06-08 11:19  hen 阅读(122) |  评论 (0)   编辑

 

ViewState - 页面状态保留

 

posted @  2011-06-04 21:53  hen 阅读(104) |  评论 (0)   编辑

 

asp.net引用用户控件

 

posted @  2011-05-18 17:03  hen 阅读(175) |  评论 (0)   编辑

 

ASP.NET 获取来源网站的网址,获取上一网页的网址,获取来源网页的URL,获取上一网页的URL

 

posted @  2011-05-18 10:42  hen 阅读(215) |  评论 (0)   编辑

 

vs 附加到进程

 

posted @  2011-05-17 13:17  hen 阅读(41) |  评论 (0)   编辑

 

C#,asp.net,命名空间名,类名,方法名的获得

 

posted @  2011-05-15 12:34  hen 阅读(210) |  评论 (0)   编辑

 

asp.net 路径

 

posted @  2011-05-15 12:20  hen 阅读(152) |  评论 (0)   编辑

 

C#,Dictionary,asp.net 字典

 

posted @  2011-05-15 10:14  hen 阅读(398) |  评论 (0)   编辑

 

C#,asp.net去除字符串前后空格,Trim()

 

posted @  2011-05-13 15:22  hen 阅读(176) |  评论 (0)   编辑

 

asp:Button 事件,点击事件 html Button runat="sever"

 

posted @  2011-05-13 15:17  hen 阅读(401) |  评论 (0)   编辑

 

枚举,以及中文对应解释

 

posted @  2011-05-11 10:04  hen 阅读(86) |  评论 (0)   编辑

 

DropDownList设置选定项,设置选择项,最安全的方法

 

posted @  2011-04-27 15:03  hen 阅读(264) |  评论 (7)   编辑

 

存储过程的使用以及查询语句的使用

 

posted @  2011-04-23 10:25  hen 阅读(33) |  评论 (1)   编辑

 

C# 后台取值

 

posted @  2011-04-23 09:55  hen 阅读(21) |  评论 (0)   编辑

 

asp.net 页面事件顺序,asp.net 事件顺序,C#事件触发顺序

 

posted @  2011-04-21 09:24  hen 阅读(166) |  评论 (0)   编辑

 

C#时间(DateTime)格式化

 

posted @  2011-04-20 17:09  hen 阅读(266) |  评论 (0)   编辑

 

C# Xml 操作

 

posted @  2011-04-19 15:45  hen 阅读(33) |  评论 (0)   编辑

 

ASP.NET PlaceHolder 服务器控件

 

posted @  2011-04-19 09:42  hen 阅读(42) |  评论 (0)   编辑

 

DropDownList 下拉菜单控件

 

posted @  2011-04-19 09:16  hen 阅读(31) |  评论 (0)   编辑

 

Session 不单单可以保存一个值,还可以保存一个类的实例

 

posted @  2011-04-19 08:40  hen 阅读(40) |  评论 (0)   编辑

 

C#服务器控件客户端ID的获得

 

posted @  2011-04-19 08:30  hen 阅读(23) |  评论 (0)   编辑

 

C# ACCESS 参数化SQL语句出错汇总

 

posted @  2011-04-18 23:54  hen 阅读(107) |  评论 (0)   编辑

 

asp.net mvc 与 asp.net结合(asp.net mvc 技巧)

 

posted @  2011-04-17 14:05  hen 阅读(277) |  评论 (0)   编辑

 

asp.net 用户控件

 

posted @  2011-04-13 14:09  hen 阅读(21) |  评论 (0)   编辑

 

asp.net(C#) Repeater 控件,重复内容(无默认html,高度可自定义化)

 

posted @  2011-04-13 13:37  hen 阅读(174) |  评论 (0)   编辑

 

C# ??(问问,问号问号)运算符,可空值(申明加?(问号))的克星

 

posted @  2011-04-13 11:43  hen 阅读(176) |  评论 (0)   编辑

 

C# access update 出错总结,注意事项

 

posted @  2011-04-13 00:10  hen 阅读(125) |  评论 (0)   编辑

 

OleDbType,C#,access 对应数据类型,互相对应

 

posted @  2011-04-12 23:32  hen 阅读(122) |  评论 (0)   编辑

 

C# 字符串常用函数

 

posted @  2011-04-11 22:04  hen 阅读(27) |  评论 (0)   编辑

 

C#图片无损压缩

 

posted @  2011-04-07 09:30  hen 阅读(198) |  评论 (5)   编辑

 

C#数据类型转换,Convert

 

posted @  2011-04-07 09:01  hen 阅读(109) |  评论 (0)   编辑

 

asp.net mvc && asp.net 页面跳转

 

posted @  2011-04-02 23:57  hen 阅读(670) |  评论 (0)   编辑

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于线程池[ThreadPool]的详细内容...

  阅读:62次