Was ist, wenn Sie mehrere asynchrone E / A-Aufgaben parallel ausführen müssen, aber sicherstellen müssen, dass nicht mehr als X-E / A-Prozesse gleichzeitig ausgeführt werden; und vor und nach E / A-Verarbeitungsaufgaben sollte keine solche Beschränkung haben.
Hier ist ein Szenario - sagen wir, es gibt 1000 Aufgaben; jeder von ihnen akzeptiert eine Textzeichenfolge als Eingabeparameter; wandelt diesen Text um (vor E / A-Verarbeitung) und schreibt dann den umgewandelten Text in eine Datei. Das Ziel besteht darin, dass die Vorverarbeitungslogik 100% der CPU / Kerne und den I / O-Teil der Tasks mit maximal 10 Grad Parallelität nutzt (maximal 10 gleichzeitig geöffnet, um Dateien gleichzeitig zu schreiben).
Können Sie einen Beispielcode für C # / .NET 4.5 bereitstellen?
Ich denke, TPL Dataflow zu verwenden, wäre eine gute Idee: Sie erstellen Pre- und Post-Process-Blöcke mit unbegrenzter Parallelität, einen Datei-Schreib-Block mit begrenzter Parallelität und verknüpfen sie miteinander. Etwas wie:
%Vor% Wo WriteToFile()
so aussehen könnte:
Es klingt, als würdest du einen Djikstra-Semaphor in Betracht ziehen, um den Zugriff auf das Starten von Aufgaben zu kontrollieren.
Das klingt jedoch nach einer typischen Warteschlange / einer festen Anzahl von Verbrauchern, die ein Problem darstellen, das eine geeignetere Methode zur Strukturierung sein kann.
Tags und Links c# task-parallel-library async-await asynchronous async-ctp