.Net TPL: ограниченный Concurrency планировщик заданий уровня с приоритетом задачи?

В настоящее время я использую LimitedConcurrencyLevelTaskScheduler, подробно описанный здесь http://msdn.microsoft.com/en-us/library/ee789351.aspx

Я хочу улучшить это, чтобы отдельным задачам присваивался приоритет. Эти приоритеты не должны соответствовать приоритету потока. Это должно влиять только на порядок запуска задач.

Кто-нибудь знает пример такого планировщика задач? (большая часть материала планирования над моей головой, поэтому было бы замечательно, если бы имелось существующее решение)

Ответ 1

Примеры расширений параллельных расширений уже предоставляют такой планировщик QueuedTaskScheduler. Этот планировщик обеспечивает приоритеты, ограничения concurrency, справедливость и мелкозернистый контроль над типом и приоритетами используемых потоков. Конечно, вам не нужно использовать или настраивать функции, которые вам не нужны.

Стивен Тууб предлагает краткое описание различных планировщиков в дополнительных расширениях параллельных расширений здесь

Чтобы использовать QueuedTaskScheduler, вы вызываете его метод ActivateNewQueue с приоритетом, который вам нужен. Этот метод возвращает новый объект Queue, созданный TaskScheduler, управляемый родительским TaskScheduler. Все задачи, которые используют определенную очередь, запланированы родительским TaskScheduler в соответствии с их приоритетами.

В следующем коде создается планировщик с максимальным уровнем concurrency 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);

Ответ 2

Используйте некоторую упорядоченную или приоритетную структуру данных для списка задач. Затем создайте свое собственное добавление, которое примет приоритет. Это может быть не так хорошо, как другие, но оно будет приоритетом в списке задач. Вы можете повторно использовать 99% кода. Просто замените LinkedList на Сортированный список или используйте LINQ для сортировки и записи метода add, который принимает приоритет.