Heim >Backend-Entwicklung >C++ >Wie kann TPL Dataflow gleichzeitige asynchrone Aufgaben einschränken?
Verwenden Sie TPL Dataflow, um die Anzahl gleichzeitiger asynchroner Aufgaben zu begrenzen
In diesem Artikel wird erläutert, wie Sie mit TPL Dataflow die Anzahl gleichzeitiger asynchroner Aufgaben effizient begrenzen und gleichzeitig die Vorteile von Multithreading voll ausnutzen können. Im Vergleich zum BlockingCollection
-Ansatz mit SemaphoreSlim
und ThrottleTasksAsync
bietet TPL Dataflow eine sauberere Lösung.
Durch die Konfiguration des TransformBlock
-Attributs von MaxDegreeOfParallelism
können wir direkt die maximale Anzahl gleichzeitig ausgeführter Aufgaben angeben. Fügen Sie URLs zu TransformBlock
hinzu und diese werden asynchron verarbeitet. Sobald die Verarbeitung abgeschlossen ist, stehen die Ergebnisse zur Verfügung.
<code class="language-csharp">var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 } ); var buffer = new BufferBlock<HttpResponse>(); downloader.LinkTo(buffer); foreach (var url in urls) downloader.Post(url); downloader.Complete(); await downloader.Completion; IList<HttpResponse> responses; if (buffer.TryReceiveAll(out responses)) { // 处理结果 }</code>
Es ist zu beachten, dass TransformBlock
Ein- und Ausgabe puffert. Daher verbinden wir es mit BufferBlock
, um zu verhindern, dass TransformBlock
blockiert, bis alle Ausgabeelemente verbraucht sind. Die BufferBlock.TryReceiveAll
-Methode wird verwendet, um alle Ergebnisse abzurufen, nachdem TransformBlock
abgeschlossen ist.
Das obige ist der detaillierte Inhalt vonWie kann TPL Dataflow gleichzeitige asynchrone Aufgaben einschränken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!