Desidero implementare una priorità ActionBlock<T>
. In modo che io possa condizionalmente dare la priorità a alcuni articoli TInput
utilizzando un Predicate<T>
.
Ho letto Parallel Extensions Extras Samples e Guide to Implementing Custom TPL Dataflow Blocks.
Ma ancora non capisco come posso implementare questo scenario.
---------------------------- MODIFICA ------------------- --------
Ci sono alcune attività, di cui 5 possono essere eseguite contemporaneamente. Quando l'utente preme il pulsante, alcuni (dipende dalla funzione del predicato) devono essere eseguiti con la massima priorità.
Infatti scrivo questo codicePersonalizzazione di ActionBlock <T>
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);
ma sembra priorità non tiene effettuata affatto.
---------------------------- MODIFICA ------------------
trovo il fatto che quando uso questa riga di codice:
actionBlockHigh = new ActionBlock<AvlHistory>(new Action<AvlHistory>(SemaphoreAction), new ExecutionDataflowBlockOptions { TaskScheduler = taskSchedulerHigh });
actionBlockLow = new ActionBlock<AvlHistory>(new Action<AvlHistory>(SemaphoreAction), new ExecutionDataflowBlockOptions { TaskScheduler = taskSchedulerLow });
applicazione Causa osservare le priorità dei compiti correttamente, ma solo un compito può essere eseguire alla volta, nel frattempo utilizzando il primo blocco di codice che viene mostrato in scorrendo, l'applicazione esegue 5 attività contemporaneamente ma in ordine di priorità inappropriato.
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 });
Aggiornamento:
Serbatoi a svick, dovrei specificare MaxMessagesPerTask
per taskSchedulerLow
.
Qual è la dettatura della priorità? È qualcosa di non correlato a 'T' affatto? O è la priorità una proprietà inerente/derivata di 'T'? – casperOne
È possibile creare un blocco buffer personalizzato che utilizza ConcurrentPriorityQueue o creare un blocco di transfromazione asincrono personalizzato. Entrambe le opzioni sono non banali. Concorda anche con @casperOne, cosa significa priorità nel tuo caso? –