2012-02-16 83 views
17

我目前使用的是LimitedConcurrencyLevelTask​​Scheduler这里详细说明http://msdn.microsoft.com/en-us/library/ee789351.aspx.Net TPL:有限并发级别具有任务优先级的任务调度程序?

我想加强这个,让个人任务可以分配优先级。这些优先级不需要映射到线程优先级。它只应该影响开始任务的顺序。

有没有人知道这样一个任务调度程序的例子? (很多调度的东西都在我的脑海中,所以如果存在现有的解决方案,它会很棒)

+0

这个调度器使用一个LinkedList 的队列。尝试将其更改为SortedList 其中T是一个结构,该结构包含一个Task和一个用于优先级的整数,并对T.Priority上的列表进行排序。 – 2012-02-16 17:34:58

+1

@IgbyLargeman - [SortedList](http://msdn.microsoft.com/en-us/library/ms132319.aspx)可能不是一个理想的解决方案 - 密钥(优先级)必须是唯一的。大多数优先级系统只有几个级别,并允许多个项目分配相同的优先级 – 2012-02-16 18:04:18

+0

这是一个坏主意。一个内部有一组(队列)队列的队列 - 每个队列有一个 - 是更好的方法。优先事项不是唯一的,仅限于少数人。也不要使用链表 - 我有一个“队列”,内部使用4096个元素的数组,加上opointers。少得多的分配 - 将项目从前面的“页面”中删除,并添加到nd中。减少分配,减少垃圾收集。 – TomTom 2012-02-16 19:35:36

回答

37

Parallel Extensions Extras Samples.已经提供了这样一个调度器QueuedTaskScheduler。此调度程序提供优先级,并发限制,公平性和对所用线程的类型和优先级的精细控制。当然,您不必使用或配置您不需要的功能。

斯蒂芬Toub提供各种调度的简短描述并行扩展额外here

要使用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); 
+0

+1:并行扩展附加功能非常宝贵! – dotnetguy 2014-01-31 08:41:45

1

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

相关问题