Ich möchte eine priorisierte ActionBlock<T>
implementieren. So kann ich einigen TInput
-Elementen bedingt Priorität geben, indem ich ein Predicate<T>
verwende.
Ich lese Parallel Extensions Extras Beispiele und Anleitung zur Implementierung von benutzerdefinierten TPL-Datenflussblöcken .
Aber immer noch nicht herausfinden, wie kann ich dieses Szenario implementieren.
---------------------------- BEARBEITEN --------------------- ------
Es gibt einige Aufgaben, von denen 5 gleichzeitig ausgeführt werden können. Wenn Benutzer die Schaltfläche drücken, sollten einige (abhängig von der Prädikatfunktion) mit der höchsten Priorität ausgeführt werden.
In der Tat schreibe ich diesen Code
Aber es scheint, dass die Priorität überhaupt nicht berücksichtigt wird.
---------------------------- BEARBEITEN ------------------
Ich finde die Tatsache, dass, wenn ich diese Codezeile verwende:
Ursache Anwendung Prioritäten der Aufgaben korrekt beachten, aber nur eine Aufgabe kann gleichzeitig ausgeführt werden, während der erste Code-Block verwendet wird, der im Fließtext angezeigt wird, weil die Anwendung 5 Aufgaben gleichzeitig ausführt, jedoch in unangemessener Reihenfolge.
%Vor% Aktualisierung:
Tanks zu svick, ich sollte MaxMessagesPerTask
für taskSchedulerLow
angeben.
Ihre Frage enthält nicht viele Details, daher ist das Folgende nur eine Schätzung dessen, was Sie möglicherweise benötigen.
Ich denke, der einfachste Weg ist, zwei ActionBlock
s zu haben, die auf QueuedTaskScheduler
von ParallelExtensionsExtras . Sie würden mit dem Prio-Objekt mit hoher Priorität und dann mit dem Prädikat verbinden. Um sicherzustellen, dass die Priorität hoher Priorität Task
s nicht wartet, legen Sie MaxMessagesPerTask
des Blocks niedriger Priorität fest.
Im Code sieht das etwa so aus:
%Vor% Dies ist nur eine Skizze dessen, was Sie tun könnten, zum Beispiel verhält sich Completion
des zurückgegebenen Blocks nicht korrekt.
Tags und Links c# multithreading task-parallel-library .net-4.5 tpl-dataflow