using System; using System.Threading; using System.Threading.Tasks; namespace PCL.Core.Utils.Threading; // Partly generated by o4-mini-high (20250709) /// /// 使用两个线程池的调度器,分为 CPU 线程池和 IO 线程池,分别负责 CPU 密集型任务和 IO 密集型任务 /// public class DualThreadPool { /// /// 两线程池分别计算的最大线程数 /// public int MaxThread { get; } private readonly TaskFactory _ioFactory; private readonly TaskFactory _cpuFactory; private readonly CancellationTokenSource _cts = new(); /// /// 初始化 实例 /// /// 参考 ,最小为 1 /// 最大线程数小于 1 public DualThreadPool(int maxThread) { if (maxThread < 1) throw new ArgumentOutOfRangeException(nameof(maxThread)); MaxThread = maxThread; var ioScheduler = new LimitedConcurrencyLevelTaskScheduler(maxThread); var cpuScheduler = new LimitedConcurrencyLevelTaskScheduler(maxThread); var cancellationToken = _cts.Token; // DenyChildAttach 防止子任务跑到外层 scheduler _ioFactory = new TaskFactory( cancellationToken, TaskCreationOptions.DenyChildAttach, TaskContinuationOptions.None, ioScheduler); _cpuFactory = new TaskFactory( cancellationToken, TaskCreationOptions.DenyChildAttach, TaskContinuationOptions.None, cpuScheduler); } /// /// 提交一段 IO 密集工作 /// public Task QueueIo(Action work) => _ioFactory.StartNew(work); /// /// 提交一段异步 IO 密集工作 /// public Task QueueIo(Func work) => _ioFactory.StartNew(work).Unwrap(); /// /// 提交一段 CPU 密集工作 /// public Task QueueCpu(Action work) => _cpuFactory.StartNew(work); /// /// 提交一段异步 CPU 密集工作 /// public Task QueueCpu(Func work) => _cpuFactory.StartNew(work).Unwrap(); /// /// 取消所有正在执行的工作 /// public void CancelAll() => _cts.Cancel(); }