首页 > 代码库 > 应用CLR的线程池
应用CLR的线程池
大家都知道这个线程的建立和销毁都需要很大的性能开销,当有比较多且不同的任务需要完成时,可以考虑使用线程池来管理这些线程。在以windows NT为内核的操作系统上每个进程都包含一个线程池,在线程池中存在许多可以被随时使用的线程,当应用程序使用时,可以从线程池中直接取出一个已经存在的线程,当某个线程使用完成后,不会立即销毁,而是放入线程池中等待下一次的使用。
在C#中,通过System .Threading.ThreadPool提供了以下的常用方法和说明。
方法名称 | 说明 |
BindHandle | 将操作系统句柄绑定到ThreadPool。 |
GetAvailableThreads | 检索由GetMaxThreads方法返回的最大线程数和当前活动线程数之间的差值。 |
GetMaxThreads | 检索同时处于活动状态的线程池请求的数目,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。 |
GetMinThreads | 检索线程池在新请求预测中维护的空闲线程数。 |
QueueUserWorkItem | 将方法排入队列以便执行,此方法在有线程池线程变得可用时执行。 |
RegisterWaitForSingleObject | 注册正在等待WaitHandle的委托。 |
SetMaxThreads | 设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变得可用。 |
SetMinThreads | 设置线程池在新请求预测中维护的空闲线程数。 |
UnsafeQueueUserWorkItem | 注册一个等待WaitHandle的委托。 |
UnRegisterWaitForSingleObject | 将指定的委托排队到线程池。 |
举个例子:
static void Main(string[] args) { int intWorkThreads; int intCompletionPortThreads; ThreadPool.GetMaxThreads(out intWorkThreads, out intCompletionPortThreads); Console.WriteLine("最大工作线程数:{0},最大I/O线程数:{1}",intWorkThreads,intCompletionPortThreads); //获取最大线程数的信息。 for (int i = 0; i < 3; i++) { ThreadPool.QueueUserWorkItem(TestThreadPool);//在线程池中申请使用线程。 } Console.ReadLine(); } static void TestThreadPool(object obj) { for (int i = 0; i < 3; i++) { //Thread.CurrentThread.ManagedThreadId获取正在运行的线程的标识。 Console.WriteLine("线程池中,正在运行的线程的唯一标识为{0}",Thread.CurrentThread.ManagedThreadId); } Thread.Sleep(100); }
线程池中运行的线程都是后台线程,就是线程池中的所有线程的IsBackground属性都被设置为True,后台线程不会影响应用程序的结束,而前台的线程对应用程序的结束会有很大影响,因为应用程序的退出必须等待所有的前台线程结束。
应用CLR的线程池
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。