優先度を実装したいActionBlock<T>
。だから私はPredicate<T>
を使って条件付きでいくつかのTInput
アイテムに優先順位をつけることができます。
私は Parallel Extensions Extras SamplesとGuide to Implementing Custom TPL Dataflow Blocksを読みました。
しかし、このシナリオをどのように実装すればよいのか分かりません。
---------------------------- EDIT ------------------- --------
いくつかのタスクがあり、それらのタスクのうち5つは同時に実行できます。ユーザーがボタンを押すと、(述語関数に依存する)タスクの中で最も優先度が高いものが実行されます。
は、実際に私はこのコード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);
を書くしかし、優先順位がすべてで、影響かかりませんようです。
---------------------------- EDIT ------------------
私はこのコード行を使用しているという事実を見つける:
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する
タンク、私はtaskSchedulerLow
ためMaxMessagesPerTask
を指定する必要があります。
優先順位を決定するのは何ですか?それは 'T 'とはまったく関係ないものですか?あるいは、優先度は 'T 'の固有/派生プロパティですか? – casperOne
ConcurrentPriorityQueueを使用するカスタムバッファブロックを作成することも、カスタム非同期トランスフォーメーションブロックを作成することもできます。両方のオプションは自明ではありません。 @casperOneにも同意します。あなたの場合、優先順位はどういう意味ですか? –