Ответ 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);