本文共 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) | 注册一个等待操作系统句柄的委托,并使用带符号整数表示超时时间。 |
线程池提供了SetMinThreads和SetMaxThreads方法来设置线程池的最小和最大线程数。需要注意的是,线程池的线程数不能小于计算机处理器的数量,否则可能影响性能。
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采用了更现代的异步模型,例如async和await,以及Task类型。这些模型更加高效且简洁。
任务取消功能通过CancellationToken和CancellationTokenSource实现。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.Timer和System.Threading.Timer。System.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/