我目前正在使用此处详述的LimitedConcurrencyLevelTaskScheduler http://msdn.microsoft.com/en-us/library/ee789351.aspx
我希望对此进行增强,以便为个人任务分配优先级。这些优先级不需要映射到线程优先级。它应该只影响任务的启动顺序。
有谁知道这样一个任务调度程序的例子? (很多调度的东西都在我的头上,所以如果有现有的解决方案会很棒)
答案 0 :(得分:39)
Parallel Extensions Extras Samples.已经提供了这样的调度程序QueuedTaskScheduler。此调度程序提供优先级,并发限制,公平性和对所用线程的类型和优先级的细粒度控制。当然,您不必使用或配置您不需要的功能。
Stephen Toub简要介绍了Parallel Extensions Extras中的各种调度程序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);
答案 1 :(得分:1)
为任务列表使用某些排序或优先级数据结构。然后创建自己的添加,其中包含优先级。这可能不如其他人好,但它会优先考虑任务列表。您可以重复使用99%的代码。只需将LinkedList替换为Sorted列表,或使用LINQ对具有优先级的方法add进行排序和编写。