zoukankan      html  css  js  c++  java
  • C#异步编程的实现方式(3)——ThreadPool线程池

    在需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类)。ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时释放资源。

    1、ThreadPool简单应用

    调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallBack委托类型的方法,并把这个方分配给线程池中的线程。线程池是自动运行的,如果线程池还没有运行,就会创建一个线程池,并启动第一个线程。如果线程池己经在运行,且有一个空闲线程来完成该任务,就把该作业传递给这个线程。

    下面这个方法是一个符合WaitCallBack委托的方法:

       1: static void WaitCallBackMethod(object param)
       2: {
       3:     for (int i = 0; i < 5; i++)
       4:     {
       5:         Console.WriteLine(String.Format("Thread {0} is running", param));
       6:         Thread.Sleep(1000);
       7:     }
       8: }

    然后在主线程里给线程池添加方法:

       1: static void Main(string[] args)
       2: {
       3:     for (int i = 1; i <= 3; i++)
       4:     {
       5:         ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
       6:     }
       7:     Console.Read();
       8: }

    QueueUserWorkItem()方法的第二个参数是个object类型的参数,可传入一个数据到线程中。在主线程中,传入了3个方法到线程池中。运行结果如下:

    image

    可以看见三个线程分别在行动。顺序不一样是因为操作系统调度的原因。

    2、最大与最小线程数

    ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池,中可用的最大线程数。如果有更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就要排队,且必须等待线程完成其任务。

    可用下面的方法查看:

       1: static void MaxThreads()
       2: {
       3:     int workerThreads;
       4:     int ioThreads;
       5:  
       6:     ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
       7:     Console.WriteLine(String.Format("Max worker threads: {0};    Max I/O threads: {1}", workerThreads, ioThreads));
       8:  
       9:     ThreadPool.GetMinThreads(out workerThreads, out ioThreads);
      10:     Console.WriteLine(String.Format("Min worker threads: {0};    Min I/O threads: {1}", workerThreads, ioThreads));
      11: }

    结果为:

    image

    3、线程池的限制

    • 线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程。
    • 不能给入池的线程设置优先级或名称。
    • 对于COM对象,入池的所有线程都是多线程单元(Multithreaded Apartment,MTA)线程。许多COM对象都需要单线程单元(Multithreaded Apartment,MTA)线程。
    • 入池的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检查器线程),就应使用Thread类创建一个线程。

    参考资料:《C#高级编程》

     http://www.cnblogs.com/sosowjb/archive/2012/08/11/2633793.html

  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/jes_shaw/p/2956018.html
Copyright © 2011-2022 走看看