C#多线程编程(3):线程池ThreadPool
2010-09-30 21:09:33 来源:WEB开发网3、线程池会根据当前系统特点对池内的线程进行优化处理。
总之使用线程池的作用就是减少创建和销毁线程的系统开销。在.NET中有一个线程的类ThreadPool,它提供了线程池的管理。
ThreadPool是一个静态类,它没有构造函数,对外提供的函数也全部是静态的。其中有一个QueueUserWorkItem方法,它有两种重载形式,如下:
public static bool QueueUserWorkItem(WaitCallback callBack):将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
public static bool QueueUserWorkItem(WaitCallback callBack,Object state):将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
QueueUserWorkItem方法中使用的的WaitCallback参数表示一个delegate,它的声明如下:
public delegate void WaitCallback(Object state)
如果需要传递任务信息可以利用WaitCallback中的state参数,类似于ParameterizedThreadStart委托。
下面是一个ThreadPool的例子,代码如下:
using System.Threading;
using System.Collections;
using System.Diagnostics;
using System;
using System.ComponentModel;
namespace ThreadPoolDemo
{
class ThreadPoolDemo1
{
public ThreadPoolDemo1()
{
}
public void Work()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(CountProcess));
ThreadPool.QueueUserWorkItem(new WaitCallback(GetEnvironmentVariables));
}
/// <summary>
/// 统计当前正在运行的系统进程信息
/// </summary>
/// <param name="state"></param>
private void CountProcess(object state)
{
Process[] processes = Process.GetProcesses();
foreach (Process p in processes)
{
try
{
Console.WriteLine("Id:{0},ProcessName:{1},StartTime:{2}", p.Id, p.ProcessName, p.StartTime);
}
catch (Win32Exception e)
{
Console.WriteLine("ProcessName:{0}", p.ProcessName);
}
finally
{
}
}
Console.WriteLine("获取进程信息完毕。");
}
/// <summary>
/// 获取当前机器系统变量设置
/// </summary>
/// <param name="state"></param>
public void GetEnvironmentVariables(object state)
{
IDictionary list=System.Environment.GetEnvironmentVariables();
foreach (DictionaryEntry item in list)
{
Console.WriteLine("key={0},value={1}", item.Key, item.Value);
}
Console.WriteLine("获取系统变量信息完毕。");
}
static void Main(string[] args)
{
ThreadPoolDemo1 tpd1 = new ThreadPoolDemo1();
tpd1.Work();
Thread.Sleep(5000);
Console.WriteLine("OK");
Console.ReadLine();
}
}
}
更多精彩
赞助商链接