“线程池”是可以用来在后台执行多个任务的线程集合,这使主线程可以自由地异步执行其他任务。线程池通常用于服务器应用程序。每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理。一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程的开销。线程池通常具有最大线程数限制。如果所有线程都繁忙,则额外的任务将放入队列中,直到有线程可用时才能够得到处理。
你可以通过System.Threading 名称空间的Thread Pool 类来使用线程池,如果你查看一下这个类,就会发现所有的成员都是静态的,而且没有公开的构造函数。这是有理由这样做的,因为每个进程只有一个线程池,并且我们不能创建新的。这个限制的目的是为了把所有的异步编程技术都集中到同一个池中。所以我们不能拥有一个通过第三方组建创建的无法管理的线程池。
ThreadPool.QueueUserWorkItem的声明如下: public static bool QueueUserWorkItem (WaitCallback callBack, object state)
第一个参数指明我们将在池中执行的函数,它的声明必须与WaitCallback委托(delegate)互相匹配:public delegate void WaitCallback (object state);
State 参数允许任何类型的信息传递到该方法中,它在调用QueueUserWorkItem时传入。
using System;
using System.Threading;
namespace ThreadPoolTest
{
class MainApp
{
static void Main()
{
WaitCallback callBack;
callBack = new WaitCallback(PooledFunc);
ThreadPool.QueueUserWorkItem(callBack, "Is there any screw left?");
ThreadPool.QueueUserWorkItem(callBack, "How much is a 40W bulb?");
ThreadPool.QueueUserWorkItem(callBack, "Decrease stock of monkey wrench");
Console.ReadLine();
}
static void PooledFunc(object state)
{
Console.WriteLine("Processing request ’{0}’", (string)state);
Thread.Sleep(2000);
Console.WriteLine("Request processed");
}
}
}


浙公网安备 33010602011771号