由CLR via C#(第三版) ,摘抄记录...
异步优点:在GUI应用程序中保持UI可响应性,以及多个CPU缩短一个耗时计算所需的时间。
1、CLR线程池基础:为提高性能,CLR包含了代码来管理他自己的线程池--线程的集合。每CLR一个线程池,这个线程池就由CLR控制的所有appDomain共享。如果你进程中有多个CLR,就有多个线程池。
CLR初始化时,池空,线程池维护一个操作请求队列。应用调用方法执行异步,将一个记录项(entry)追加到线程池的队列。线程池从队列提取记录项,派遣(dispatch)给一个线程池线程,如没有,则创建一个新线程。完成任务后线程不销毁,在线程池空闲等待响应另一个请求,这样提高性能。 当请求速度超过处理速度,就会创建额外线程。如果请求停止,线程空闲一段时间后,会自己醒来终止自己以释放资源。 线程池是启发式的,由任务多少,和可用CPU的多少,创建线程。
在内部,线程池将自己的线程分为 工作者(Worker)线程和I/0线程。
2、简单的计算限制操作
将一个异步的、计算限制的操作放到一个线程池的队列中,通常可以调用ThreadPool类定义的以下方法之一:
//将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。 static Boolean QueueUserWorkItem(WaitCallback callBack); //将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。 static Boolean QueueUserWorkItem(WaitCallback callBack,Object state);
~~~~
模拟程序
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.WriteLine("Main thread: queuing an asynchronous operation"); 6 ThreadPool.QueueUserWorkItem(ComputeBoundOp, 5); 7 Console.WriteLine("Main thread: Doing other work here..."); 8 Thread.Sleep(10000); // 模拟其它工作 (10 秒钟) 9 //Console.ReadLine(); 10 } 11 12 // 这是一个回调方法,必须和WaitCallBack委托签名一致 13 private static void ComputeBoundOp(Object state) 14 { 15 // 这个方法通过线程池中线程执行 16 Console.WriteLine("In ComputeBoundOp: state={0}", state); 17 Thread.Sleep(1000); // 模拟其它工作 (1 秒钟) 18 19 // 这个方法返回后,线程回到线程池,等待其他任务 20 } 21 }