C# 多线程ThreadPool用法举例

概述

ThreadPool是.Net Framework 2.0版本中出现的。自从Task出来以后,ThreadPool已经很少用了,但是一些老的代码或者一些古老的程序猿还是会用到他,所以我们可以不用它,但是还是有必须学习和了解他.

ThreadPool用法举例

static void Main(string[] args)
        {
            string str = "当前时间是";
            ThreadPool.SetMaxThreads(5,5);
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(ThreadFuc, str);
            }
          
            Console.ReadKey();
        }


        public static void ThreadFuc(object str)
        {
            Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");
            Thread.Sleep(1000);
        }

运行结果:

0e3101f92cadac9f79776720f6093a57.png

我们看时间差不多在同一时间完成了,如果不开启线程:则前后需要10秒钟

dce08d84b3eee55e34df5d9232101926.png

QueueUserWorkItem有两个重载,分别是带参数和不带参数的

public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callBack, object state);

带参数的解释如下:

//
        // 摘要:
        //     将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
        //
        // 参数:
        //   callBack:
        //     System.Threading.WaitCallback,它表示要执行的方法。
        //
        //   state:
        //     包含方法所用数据的对象。
        //
        // 返回结果:
        //     如果此方法成功排队,则为 true;如果无法将该工作项排队,则引发 System.NotSupportedException。
        //
        // 异常:
        //   T:System.NotSupportedException:
        //     承载公共语言运行时 (CLR),并且主机不支持此操作。
        //
        //   T:System.ArgumentNullException:
        //     callBack 为 null。

  ThreadPool类的方法

3a1fd522c43e53a9731c1da334758c30.png

SetMaxThreads用来设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。函数原型如下

public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
// 参数:
        //   workerThreads:
        //     线程池中辅助线程的最大数目。
        //
        //   completionPortThreads:
        //     线程池中异步 I/O 线程的最大数目。
        //
        // 返回结果:
        //     如果更改成功,则为 true;否则为 false。

线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性,其次,开发人员把线程交给系统管理,可以集中精力处理其他任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值