C#线程池

创建过多的线程会增加操作系统资源占用,并且还要处理资源要求和潜在的占用冲突。并且使用了多线程之后将使代码的执行流程和资源竞争情况变得复杂,稍不留心就会产生bug。
与使用单个线程相比,使用线程池的优点如下:
1.缩短应用程序响应时间。因为在线程池中有线程的线程处于等待分配任务状态,无需创建线程
2.不必管理和维护生存周期短暂的线程,不用在创建时为其分配资源,在其执行完任务之后释放资源。
3.线程池会根据当前系统特点对池内的线程进行优化处理。
宗旨使用线程池的作用是减少创建和销毁线程的系统开销。
.Net中有一个提供线程池管理的类ThreadPool。
ThreadPool是一个静态类,它没有构造函数,对外提供的函数也全部是静态的。其中有一个QueueUserWorkItem方法,有两种重载形式
public static bool QueueUserWorkItem(WaitCallback callBack):将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
public static bool QueueUserWorkItem(WaitCallback callBack,Object state):将方法排入队列以便执行,并指定包含该方法所用的数据对象。此方法在有线程池线程变得可用时执行。

public class ThreadPoolDemo
{
  public ThreadPoolDemo(){}
  public void Work()
  {
    ThreadPool.QueueUserWorkItem(new WaitCallback(countProcess));
    ThreadPool.QueueUserWorkItem(new WaitCallback(getEnvironmentVariables));
  }
  private void countProcess(object state)
  {
    Process[] processes = Process.GetProcesses();
    foreach(Process p in processes)
    {
      Console.WriteLine("Id:{0},ProcessName:{1},StartTime:{2}",p.Id,p.ProcessName,p.StartTime);
    }
    Console.WriteLine("获取进程信息完毕");
  }
  private 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("获取系统变量信息完毕");
  }
  public void Begin()
  {
    Work();
    Thread.Sleep(5000);
    Console.WriteLine("OK");
    Console.ReadLine();
  }
}

线程池的缺点:
1、一旦加入到线程池中就没有办法让它停止,除非任务执行完毕自动停止;
2、一个进程共享一个线程池;
3、要执行的任务不能有返回值(当然,线程中要执行的方法也是不能有返回值,如果确实需要返回值必须采用其它技巧来解决);
4、在线程池中所有任务的优先级都是一样的,无法设置任务的优先级;
5、不太适合需要长期执行的任务(比如在Windows服务中执行),也不适合大的任务;
6、不能为线程设置稳定的关联标识,比如为线程池中执行某个特定任务的线程指定名称或者其它属性。

原文地址:https://www.cnblogs.com/ecosu/p/4285993.html