C#多线程之线程池ThreadPool详解_第1页
C#多线程之线程池ThreadPool详解_第2页
C#多线程之线程池ThreadPool详解_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C#多线程之线程池ThreadPool详解一、ThreadPool概述

提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步I/O、代表其他线程等待以及处理计时器。

创建线程需要时间。如果有不同的小任务要完成,就可以事先创建许多线程/在应完成这些任务时发出请求。不需要自己创建这样一个列表。该列表由ThreadPool类托管。

这个类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。

如果有更多的作业要处理,线程池中线程的个数也达到了极限,最新的作业就要排队,且必须等待线程完成其任务。

线程池使用起来很简单,但它有一些限制:

线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程。不能给入池的线程设置优先级或名称。对于COM对象,入池的所有线程都是多线程单元(multithreadedapartment,MTA)线程。许多COM对象都需要单线程单元(single-threadedapartment,MTA)线程。入池的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检杳器线程),就应使用Thread类创建一个线程.

使用线程池线程的操作的情况包括:

当您创建Task或TaskTResult对象以异步方式执行某项任务,默认情况下任务调度在线程池线程上运行的。异步计时器使用线程池。线程池线程从System.Threading.Timer类执行回调,和从System.Timers.Timer类引发事件。当使用已注册的等待句柄时,系统线程监视等待句柄的状态。等待操作完成后,从线程池的工作线程将执行相应的回调函数。当您调用QueueUserWorkItem方法进行排队,以在线程池线程上执行的方法。为此,可将该方法传递WaitCallback委托。

GetAvailableThreads(Int32,Int32)

检索由GetMaxThreads(Int32,Int32)方法返回的最大线程池线程数和当前活动线程数之间的差值。GetMaxThreads(Int32,Int32)

检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。SetMaxThreads(Int32,Int32)

设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。GetMinThreads(Int32,Int32)

发出新的请求时,在切换到管理线程创建和销毁的算法之前检索线程池按需创建的线程的最小数量。SetMinThreads(Int32,Int32)

发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量。QueueUserWorkItem(WaitCallback,Object)

将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。RegisterWaitForSingleObject(WaitHandle,WaitOrTimerCallback,Object,Int32,Boolean)

注册一个等待WaitHandle的委托,并指定一个32位有符号整数来表示超时值(以毫秒为单位)。

三、获取线程数方法

inti=0;

intj=0;

//前面是辅助(也就是所谓的工作者)线程,后面是I/O线程

ThreadPool.GetMaxThreads(outi,outj);

Console.WriteLine(i.ToString()+""+j.ToString());//默认都是1000

//获取空闲线程,由于现在没有使用异步线程,所以为空

ThreadPool.GetAvailableThreads(outi,outj);

Console.WriteLine(i.ToString()+""+j.ToString());//默认都是1000

四、QueueUserWorkItem(WaitCallback,Object)

将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。

publicstaticboolQueueUserWorkItem(System.Threading.WaitCallbackcallBack,objectstate);

实例:

staticvoidMain(string[]args)

Personp=newPerson(1,"刘备");

//启动工作者线程

ThreadPool.QueueUserWorkItem(newWaitCallback(RunWorkerThread),p);

staticvoidRunWorkerThread(object

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论