博客
关于我
C#多线程(12):线程池
阅读量:474 次
发布时间:2019-03-06

本文共 4455 字,大约阅读时间需要 14 分钟。

线程池

在线程池(ThreadPool)中,我们可以使用System.Threading.ThreadPool类来执行任务和操作。线程池由CLR(常规语言运行时)管理线程的生命周期,因此我们可以专注于实现任务,而无需处理线程管理。


线程池的常用属性和方法

属性

属性 说明
CompletedWorkItemCount 获取迄今为止已处理的工作项数。
PendingWorkItemCount 获取当前已加入处理队列的工作项数。
ThreadCount 获取当前存在的线程池线程数。

方法

方法 说明
BindHandle(IntPtr) 将操作系统句柄绑定到线程池。
BindHandle(SafeHandle) 将操作系统句柄绑定到线程池。
GetAvailableThreads(Int32, Int32) 检索由GetMaxThreads方法返回的最大线程池线程数和当前活动线程数之间的差值。
GetMaxThreads(Int32, Int32) 检索可以同时处于活动状态的线程池请求的最大数目。
GetMinThreads(Int32, Int32) 设置线程池按需创建的线程的最小数量。
QueueUserWorkItem(WaitCallback) 将方法排入线程池队列以便执行。
QueueUserWorkItem(WaitCallback, Object) 将方法排入线程池队列,并指定包含该方法所用数据的对象。
QueueUserWorkItem(Action, TState, Boolean) 将Action委托排入线程池队列,并提供数据。
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) 注册一个等待操作系统句柄的委托。
SetMaxThreads(Int32, Int32) 设置线程池的最大线程数。
SetMinThreads(Int32, Int32) 设置线程池按需创建的线程的最小数量。
UnsafeQueueNativeOverlapped(NativeOverlapped) 将重叠的I/O操作排队执行。
UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) 将指定的工作项对象排队到线程池。
UnsafeQueueUserWorkItem(WaitCallback, Object) 将指定的委托排队到线程池,但不会传播调用堆栈。
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) 注册一个等待操作系统句柄的委托,并使用带符号整数表示超时时间。

线程池线程数

线程池提供了SetMinThreadsSetMaxThreads方法来设置线程池的最小和最大线程数。需要注意的是,线程池的线程数不能小于计算机处理器的数量,否则可能影响性能。

示例

using System;using System.Threading;class Program{    static void Main(string[] args)    {        // 不断加入任务        for (int i = 0; i < 8; i++)            ThreadPool.QueueUserWorkItem(state =>            {                Thread.Sleep(100);                Console.WriteLine("");            });        for (int i = 0; i < 8; i++)            ThreadPool.QueueUserWorkItem(state =>            {                Thread.Sleep(TimeSpan.FromSeconds(1));                Console.WriteLine("");            });        Console.WriteLine("此计算机处理器数量:" + Environment.ProcessorCount);        Console.WriteLine("当前线程池存在线程数:" + ThreadPool.ThreadCount);        Console.WriteLine("当前已处理的工作项数:" + ThreadPool.CompletedWorkItemCount);        Console.WriteLine("当前已加入处理队列的工作项数:" + ThreadPool.PendingWorkItemCount);        int count;        int ioCount;        ThreadPool.GetMinThreads(out count, out ioCount);        Console.WriteLine("默认最小辅助线程数:" + count + ", 默认最小异步IO线程数:" + ioCount);        ThreadPool.GetMaxThreads(out count, out ioCount);        Console.WriteLine("默认最大辅助线程数:" + count + ", 默认最大异步IO线程数:" + ioCount);        Console.ReadKey();    }}

不支持的线程池异步委托

在.NET Core中,线程池不支持传统的异步委托模型。相比于.NET Framework(如上面的示例),.NET Core采用了更现代的异步模型,例如asyncawait,以及Task类型。这些模型更加高效且简洁。


任务取消功能

任务取消功能通过CancellationTokenCancellationTokenSource实现。CancellationToken用于传播取消信号,CancellationTokenSource用于向取消标记发送信号。通过检查CancellationToken.IsCancellationRequested,线程可以在需要时停止执行。

示例

using System;using System.Threading;using System.Threading.Tasks;class Program{    static void Main()    {        CancellationTokenSource cts = new CancellationTokenSource();        Console.WriteLine("按下回车键,将取消任务");        new Thread(() =>        {            CanceTask(cts.Token);        }).Start();        new Thread(() =>        {            CanceTask(cts.Token);        }).Start();        Console.ReadKey();        // 取消执行        cts.Cancel();        Console.WriteLine("完成");        Console.ReadKey();    }    private static void CanceTask(CancellationToken token)    {        Console.WriteLine("第一阶段");        Thread.Sleep(TimeSpan.FromSeconds(1));        if (token.IsCancellationRequested)            return;        Console.WriteLine("第二阶段");        Thread.Sleep(TimeSpan.FromSeconds(1));        if (token.IsCancellationRequested)            return;        Console.WriteLine("第三阶段");        Thread.Sleep(TimeSpan.FromSeconds(1));        if (token.IsCancellationRequested)            return;        Console.WriteLine("第四阶段");        Thread.Sleep(TimeSpan.FromSeconds(1));        if (token.IsCancellationRequested)            return;        Console.WriteLine("第五阶段");        Thread.Sleep(TimeSpan.FromSeconds(1));        if (token.IsCancellationRequested)            return;    }}

计时器

线程池提供了两个计时器类型:System.Timers.TimerSystem.Threading.TimerSystem.Threading.Timer适用于在线程池线程上执行定时任务,而System.Timers.Timer则提供了更高级别的功能。

示例

using System;using System.Threading;class Program{    static void Main()    {        Timer timer = new Timer(TimeTask, null, 100, 1000);        Console.ReadKey();    }    private static void TimeTask(object state)    {        Console.WriteLine("www.whuanle.cn");    }}

通过以上内容,我们可以更好地理解和使用线程池中的任务执行和线程管理功能。

转载地址:http://pnybz.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | 实战 | 使用OpenCV和Streamlit搭建虚拟化妆应用程序(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 使用OpenCV确定对象的方向(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
查看>>
OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
查看>>
OpenCV与AI深度学习 | 实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序
查看>>
OpenCV与AI深度学习 | 实战 | 基于OpenCV和K-Means聚类实现颜色分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
查看>>
OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
查看>>
OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
查看>>
OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
查看>>
OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
查看>>
OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 水下检测+扩散模型:或成明年CVPR最大惊喜!
查看>>
OpenCV与AI深度学习 | 深度学习检测小目标常用方法
查看>>
OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
查看>>