c#中多线程的线程池是什么

  介绍

这篇文章主要介绍了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   null

c#中多线程的线程池是什么