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

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

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

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

2 ответа

Решение

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

Стивен Тауб дает краткое описание различных планировщиков в дополнительных разделах Parallel Extensions здесь

Чтобы использовать QueuedTaskScheduler, вы вызываете его метод ActivateNewQueue с нужным вам приоритетом. Этот метод возвращает новый производный от TaskScheduler объект Queue, управляемый родительским TaskScheduler. Все задачи, которые используют определенную очередь, планируются родительским 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 на отсортированный список или используйте LINQ для сортировки и записи метода add, который имеет приоритет.

Другие вопросы по тегам