这篇文章主要介绍了c#中多线程的线程池是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
<强>线强>程池System.Threading。ThreadPool,可用于发送工作项,处理异步I/O,代表其它线程等待以及处理计时器。基本用法:
,,,,,,,,public void 主要() ,,,,,,,{ ,,,,,,,,,,,ThreadPool.QueueUserWorkItem (JobForAThread);,//,将某工作交给线程池}void JobForAThread (object 状态),//,线程要执行的工作:满足,委托WaitCallback ,,,,,,, {for (int 小姐:=,1;,小姐:& lt;=, 5;,我+ +) ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,Console.WriteLine (“Running  Thread {0}, Step , {1},,, Thread.CurrentThread.ManagedThreadId,, i); ,,,,,,,,,,,,,,,thread . sleep (500); ,,,,,,,,,,,} ,,,,,,,}
在执行,ThreadPool.QueueUserWorkItem()方法后,处理器就会自动在池中选择一个线程来处理”工作内容”。
,1 .如果线程池还没有运行,就会创建一个线程池,并启动第一个线程。
,2 .如果线程池已经在运行,且至少有一个空闲的线程,线程池就会把改”工作内容”交给这个空闲的线程来处理。
,3.如果当时线程池没有空闲的线程,该工作就会处于等待状态,直到有空闲线程来处理它。
<强>通>强过ThreadPool.GetMaxThreads()方法来检索可以同时处于活动状态的线程池请求的数目。
,,,,,,,,,,,,int vWorkerThreads;, int vCompletionPortThreads; ,,,,,,,,,,,ThreadPool.GetMaxThreads (out vWorkerThreads, out vCompletionPortThreads); ,,,,,,,,,,,Console.WriteLine(“池中辅助线程的最大数{0},池中异步,我/O 线程的最大数{1},,,vWorkerThreads,, vCompletionPortThreads);
可以通过ThreadPool.SetMaxThreads()方法设置可以同时处于活动状态的线程池请求的数目。
ThreadPool。SetMaxThreads (5 4);
但是,不能将辅助线程的数目或异步I/O完成线程的数目设置位小于计算机处理器的数目。线程池使用很简单,但又一些限制:
, 1。线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有后台线程就会停止。不能把入池的线程改为前台线程。
, 2。不能给入池的线程设置优先级或名称。
, 3。入池的线程只能用于时间较短的任务。如果线程要一直运行,就应该使用线程类创建一个线程。
<强>给强> JobForAThread()工作任务传递参数对象状态,调用:
,,,,,,,,public void 主要() ,,,,,,,{ ,,,,,,,,,,,ThreadPool.QueueUserWorkItem (JobForAThread,“这是传递给工作内容的参数“),,//,添加工作的同时,传递参数Console.ReadKey();,//,让主线程等待,否则“一闪而过”,,,,,,,,}void JobForAThread (object 状态), ,,,,,,,{ ,,,,,,,,,,,Console.WriteLine(“收到信息:{0},,,(字符串)状态),,//,处理传进来的数据for (int 小姐:=,1;,小姐:& lt;=, 5;,我+ +) ,,,,,,,,,,,{,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,Console.WriteLine (“Running  Thread {0}, Step , {1},,, Thread.CurrentThread.ManagedThreadId,, i); ,,,,,,,,,,,,,,,thread . sleep (500); ,,,,,,,,,,,} ,,,,,,,}
<强>简单的控制操作强>
<强>一强>般情况下,“工作“交给线程池后,就不受控制了,它会由处理器自动决定什么时候开始执行(当然是有空闲线程才行)。可以通过以下代码,让工作在指定时候以后再开始执行。
,,,,,,,,ManualResetEvent mManualEvent; public void 主要() ,,,,,,,{ ,,,,,,,,,,,mManualEvent =, new ManualResetEvent(假的),,//,实例ThreadPool.QueueUserWorkItem (JobForAThread); ,,,,,,,,,,,Console.WriteLine(“{0},任务已经交给线程池了,但是它没有执行!”,,DateTime.Now.ToString (“HH: mm: ss")); ,,,,,,,,,,,thread . sleep(10000);,//,等待,10 smmanualevent.set();,,//,发出信号,让线程继续执行,,,,,,,,,,, null null null null null null null null null null null null null null null null null null null null null null null null null null nullc#中多线程的线程池是什么