.Net TPL:具有任务优先级的有限并发级别任务调度程序

本文关键字:并发 任务调度程序 优先级 TPL 任务 Net | 更新日期: 2023-09-27 18:25:03

我当前正在使用此处详细介绍的LimitedCurrentLevelTaskSchedulerhttp://msdn.microsoft.com/en-us/library/ee789351.aspx

我想增强这一点,以便可以为个人任务分配优先级。这些优先级不需要映射到线程优先级。它应该只影响任务的启动顺序。

有人知道这样一个任务调度器的例子吗?(很多日程安排的事情都让我不知所措,所以如果有一个现有的解决方案就太好了)

.Net TPL:具有任务优先级的有限并发级别任务调度程序

并行扩展额外示例。已经提供了这样一个调度器QueuedTaskScheduler。该调度程序提供优先级、并发限制、公平性以及对所用线程的类型和优先级的细粒度控制。当然,您不必使用或配置不需要的功能。

Stephen Toub在这里简要介绍了并行扩展插件中的各种调度器

要使用QueuedTaskScheduler,可以调用其具有所需优先级的ActivateNewQueue方法。此方法返回由父TaskScheduler管理的新TaskScheduler派生的Queue对象。使用特定队列的所有任务都由父TaskScheduler根据优先级进行调度。

以下代码创建了一个最大并发级别为4的调度器,两个优先级队列,并在第一个队列上调度任务:

QueuedTaskScheduler qts = new QueuedTaskScheduler(TaskScheduler.Default,4);
TaskScheduler pri0 = qts.ActivateNewQueue(priority: 0);
TaskScheduler pri1 = qts.ActivateNewQueue(priority: 1);
Task.Factory.StartNew(()=>{ }, 
                      CancellationToken.None, 
                      TaskCreationOptions.None, 
                      pri0);

为任务列表使用一些排序或优先级数据结构。然后创建您自己的添加,以接受优先级。这可能不如其他方法,但它会优先考虑任务列表。您可以重用那里99%的代码。只需将LinkedList替换为Sorted列表,或者使用LINQ排序并编写一个具有优先级的方法add。