Я хочу реализовать приоритет ActionBlock<T>
. Чтобы я мог условно дать приоритет некоторым TInput
элементам, используя Predicate<T>
.
Я прочитал Дополнительные примеры параллельных расширений и Руководство по реализации пользовательских блоков потока данных TPL.
Но все еще не понимаю, как реализовать этот сценарий.
----------- ------------------ РЕДАКТИРОВАТЬ -----------------------------------------
Там несколько задач, 5 из которых могут выполняться одновременно. Когда пользователь нажимает кнопку, некоторые (зависит от функции предиката) задачи должны выполняться с наибольшим приоритетом.
На самом деле я пишу этот код
TaskScheduler taskSchedulerHighPriority;
ActionBlock<CustomObject> actionBlockLow;
ActionBlock<CustomObject> actionBlockHigh;
...
queuedTaskScheduler = new QueuedTaskScheduler(TaskScheduler.Default, 5);
taskSchedulerHigh = queuedTaskScheduler.ActivateNewQueue(0);
taskSchedulerLow = queuedTaskScheduler.ActivateNewQueue(1);
...
actionBlockHigh = new ActionBlock<CustomObject>(new Action<CustomObject>(method), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5, SingleProducerConstrained = false, TaskScheduler = taskSchedulerHigh });
actionBlockLow = new ActionBlock<CustomObject>(new Action<CustomObject>(method), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5, MaxMessagesPerTask = 1, TaskScheduler = taskSchedulerLow });
...
if (predicate(customObject))
actionBlockHigh.Post(customObject);
else
actionBlockLow.Post(customObject);
Но кажется, что приоритет вообще не действует.
---------------------------- РЕДАКТИРОВАТЬ ------ ------------
Я нахожу тот факт, что когда я использую эту строку кода:
actionBlockHigh = new ActionBlock<AvlHistory>(new Action<AvlHistory>(SemaphoreAction), new ExecutionDataflowBlockOptions { TaskScheduler = taskSchedulerHigh });
actionBlockLow = new ActionBlock<AvlHistory>(new Action<AvlHistory>(SemaphoreAction), new ExecutionDataflowBlockOptions { TaskScheduler = taskSchedulerLow });
Причина, по которой приложение правильно соблюдает приоритеты задач, но одновременно может выполняться только одна задача, в то время как использование первого блока кода, показанного в потоке, приводит к тому, что приложение запускает 5 задач одновременно, но с неподходящим порядком приоритетов.
actionBlockHigh = new ActionBlock<AvlHistory>(new Action<AvlHistory>(SemaphoreAction), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5, TaskScheduler = taskSchedulerHigh });
actionBlockLow = new ActionBlock<AvlHistory>(new Action<AvlHistory>(SemaphoreAction), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5, TaskScheduler = taskSchedulerLow });
Обновление:
Танки на свик, я должен указать MaxMessagesPerTask
для taskSchedulerLow
.
T
? Или приоритет является неотъемлемым/производным свойствомT
? - person casperOne   schedule 12.12.2012