<p>线程池</p>
<p><br />
目录</p>
<p>线程池功能<br />
什么情况下不要使用线程池<br />
传递参数<br />
线程池示例<br />
展开<br />
线程池功能<br />
什么情况下不要使用线程池<br />
传递参数<br />
线程池示例<br />
展开<br />
<br />
<br />
编辑本段<br />
线程池功能</p>
<p> 应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。<br />
<br />
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程完成后才启动<br />
<br />
编辑本段<br />
什么情况下不要使用线程池</p>
<p> ●如果需要使一个任务具有特定优先级<br />
<br />
●如果具有可能会长时间运行(并因此阻塞其他任务)的任务<br />
<br />
●如果需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)<br />
<br />
●如果需要永久标识来标识和控制线程,比如想使用专用线程来终止该线程,将其挂起或按名称发现它<br />
<br />
System.ThreadingPool类实现了线程池,这是一个静态类,它提供了管理线程的一系列方法<br />
<br />
Threading.QueueUserItem方法在线程池中创建一个线程池线程来执行指定方法(用委托WaitCallBack表示),并将该线程排入线程池的队列等待执行。<br />
<br />
public static Boolean QueueUserWorkItem(WaitCallback wc,Object state);<br />
<br />
编辑本段<br />
传递参数</p>
<p> 调用QueueUserWorkItem时传入的Object类型参数传递到任务过程,可以通过这种方式来向任务过程传递参数。如果任务过程需要多个参数,可以定义包含这些数据的类,并将其强制转换为Object数据类型<br />
<br />
编辑本段<br />
线程池示例</p>
<p> // ThreadPool.cs<br />
<br />
// 线程池示例<br />
<br />
using System;<br />
<br />
using System.Threading;<br />
<br />
public class Test<br />
<br />
{<br />
<br />
// 存放要计算的数值的字段<br />
<br />
static double number1 = -1;<br />
<br />
static double number2 = -1;<br />
<br />
public static void Main()<br />
<br />
{<br />
<br />
// 获取线程池的最大线程数和维护的最小空闲线程数<br />
<br />
int maxThreadNum, portThreadNum;<br />
<br />
int minThreadNum;<br />
<br />
ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);<br />
<br />
ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);<br />
<br />
Console.WriteLine("最大线程数:", maxThreadNum);<br />
<br />
Console.WriteLine("最小空闲线程数:", minThreadNum);<br />
<br />
// 函数变量值<br />
<br />
int x = 15600;<br />
<br />
// 启动第一个任务:计算x的8次方<br />
<br />
Console.WriteLine("启动第一个任务:计算"+{0}+"的8次方。", x);<br />
<br />
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);<br />
<br />
// 启动第二个任务:计算x的8次方根<br />
<br />
Console.WriteLine("启动第二个任务:计算"+{0}+"的8次方根。", x);<br />
<br />
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);<br />
<br />
// 等待,直到两个数值都完成计算<br />
<br />
while (number1 == -1 || number2 == -1) ;<br />
<br />
// 打印计算结果<br />
<br />
Console.WriteLine("y() = ", x, number1 + number2);<br />
<br />
}<br />
<br />
// 启动第一个任务:计算x的8次方<br />
<br />
static void TaskProc1(object o)<br />
<br />
{<br />
<br />
number1 = Math.Pow(Convert.ToDouble(o), 8);<br />
<br />
}<br />
<br />
// 启动第二个任务:计算x的8次方根<br />
<br />
static void TaskProc2(object o)<br />
<br />
{<br />
<br />
number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);<br />
<br />
}<br />
<br />
}<br />
线程池结构<br />
[HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public static class ThreadPool<br />
{<br />
[Obsolete("ThreadPool.BindHandle(IntPtr) has been deprecated. Please use ThreadPool.BindHandle(SafeHandle) instead.", false), SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] public static bool BindHandle(IntPtr osHandle)</p>