漳州 网站建设公司,重庆seo建站,wordpress图片主题Repay,网络规划与设计师一、基本介绍 TaskScheduler 是一个抽象类#xff0c;用于控制任务的执行方式#xff0c;特别是它们如何被安排到线程池中的线程上执行。 TaskScheduler 负责将 Task 对象排队并决定何时、以何种方式执行这些任务。 二、TaskScheduler的作用
调度任务#xff1a;将任务分配…一、基本介绍 TaskScheduler 是一个抽象类用于控制任务的执行方式特别是它们如何被安排到线程池中的线程上执行。 TaskScheduler 负责将 Task 对象排队并决定何时、以何种方式执行这些任务。 二、TaskScheduler的作用
调度任务将任务分配给线程池中的线程执行。
控制并发通过限制同时执行的任务数量来控制并发级别。
异常处理虽然不是直接由 TaskScheduler 处理异常但它通过控制任务的执行环境间接影响了异常的处理方式。 三、TaskScheduler的关键点
默认调度器大多数情况下任务默认在 TaskScheduler.Default 调度器上运行它通常与线程池中的线程关联。
自定义调度器你可以创建自定义的 TaskScheduler 来控制任务的执行方式例如限制任务并发数或在特定的线程上运行任务。
任务调度你可以使用 TaskScheduler 来调度任务的执行例如使用 Task.Run 方法时可以指定调度器。
同步上下文在 UI 应用程序中TaskScheduler 通常与 SynchronizationContext 一起使用以确保任务在正确的线程上执行例如在 UI 线程上更新 UI 元素。
任务调度器的层次结构TaskScheduler 可以有一个或多个父调度器这允许你创建复杂的任务调度层次结构。 四、TaskScheduler的简单例子
using System;
using System.Threading.Tasks;class Program
{static void Main(){// 获取默认的任务调度器TaskScheduler defaultScheduler TaskScheduler.Default;// 创建一个任务Task myTask new Task(() {Console.WriteLine(Task is running on: TaskScheduler.Current.ToString());});// 在默认调度器上运行任务myTask.Start(defaultScheduler);// 等待任务完成myTask.Wait();}
} 五、TaskScheduler的完整例子
步骤 1: 创建自定义 TaskScheduler 类
首先我们需要创建一个继承自 TaskScheduler 的类并实现必要的方法。
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler
{private readonly int _maxDegreeOfParallelism;private readonly ConcurrentQueueTask _tasks new ConcurrentQueueTask();private readonly CancellationTokenSource _cts new CancellationTokenSource();private readonly object _lockObject new object();private int _currentActiveTasks;public LimitedConcurrencyLevelTaskScheduler(int maxDegreeOfParallelism){if (maxDegreeOfParallelism 0) throw new ArgumentOutOfRangeException(maxDegreeOfParallelism);_maxDegreeOfParallelism maxDegreeOfParallelism;}protected override void QueueTask(Task task){_tasks.Enqueue(task);}protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued){return false;}protected override IEnumerableTask GetScheduledTasks(){return _tasks;}public void Start(){for (int i 0; i _maxDegreeOfParallelism; i){Thread thread new Thread(() {try{while (!_tasks.IsEmpty || !_cts.Token.IsCancellationRequested){Task task;if (_tasks.TryDequeue(out task)){base.TryExecuteTask(task);}else{Thread.Yield();}}}catch (Exception ex){Console.WriteLine(Thread encountered an exception: ex.Message);}});thread.IsBackground true;thread.Start();}}public void Stop(){_cts.Cancel();}
} 步骤 2: 使用自定义 TaskScheduler
现在我们可以使用这个自定义的 TaskScheduler 来调度任务。
class Program
{static void Main(string[] args){LimitedConcurrencyLevelTaskScheduler scheduler new LimitedConcurrencyLevelTaskScheduler(2);scheduler.Start();for (int i 0; i 10; i){Task.Run(() DoWork(i), scheduler);}Console.WriteLine(Press any key to exit...);Console.ReadKey();scheduler.Stop();}static void DoWork(int workItemId){Console.WriteLine($Work item {workItemId} is running on thread {Thread.CurrentThread.ManagedThreadId});Thread.Sleep(1000); // Simulate work by sleeping}
} 解释
LimitedConcurrencyLevelTaskScheduler这是一个自定义的 TaskScheduler它接受一个参数 maxDegreeOfParallelism这定义了同时运行的最大任务数。
QueueTask这个方法将任务添加到一个线程安全的队列中。
TryExecuteTaskInline这个方法始终返回 false因为我们不在调用线程上直接执行任务。
GetScheduledTasks返回当前队列中的任务。
Start启动指定数量的线程来处理队列中的任务。
Stop停止所有线程并取消所有任务。