우선 순위 ActionBlock<T>
을 구현하고 싶습니다. 그래서 나는 조건부로 Predicate<T>
을 사용하여 일부 TInput
항목에 우선 순위를 부여 할 수 있습니다.
나는 Parallel Extensions Extras Samples과 Guide to Implementing Custom TPL Dataflow Blocks을 읽었습니다.
그러나 여전히이 시나리오를 어떻게 구현할 수 있는지 파악하지 못합니다.
---------------------------- 편집 ------------------- --------
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);
쓰기하지만 우선 순위는 전혀 영향을 고려하지 않습니다 보인다.
---------------------------- 편집 ------------------
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 });
업데이트 :
탱크 내가 taskSchedulerLow
에 대한 MaxMessagesPerTask
를 지정해야합니다, svick합니다.
우선 순위를 결정하는 것은 무엇입니까? 'T '와 전혀 관련이없는 것입니까? 아니면 'T'의 고유/파생 된 속성입니까? – casperOne
ConcurrentPriorityQueue를 사용하는 사용자 정의 버퍼 블록을 만들거나 사용자 정의 비동기 transfromation 블록을 생성 할 수 있습니다. 두 옵션 모두 중요하지 않습니다. @casperOne에 동의하십시오. 귀하의 경우 우선 순위는 무엇을 의미합니까? –