優先的に実装したいActionBlock<T>
。TInput
を使用して、条件付きで一部のアイテムを優先できるようにしPredicate<T>
ます。Parallel Extensions Extras SamplesとGuide to Implementing Custom TPL Dataflow Blocks
を読み ました。
しかし、このシナリオをどのように実装できるかまだわかりません。
- - - - - - - - - - - - - - 編集 - - - - - - - - - - - ------
いくつかのタスクがあり、そのうちの 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 });
アプリケーションはタスクの優先度を正しく監視しますが、一度に実行できるタスクは 1 つだけです。一方、フローに示されている最初のコード ブロックを使用すると、アプリケーションは 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 });
更新:
svick へのタンク、指定する必要がありMaxMessagesPerTask
ますtaskSchedulerLow
。