Bei der asynchronen Programmierung ist es oft notwendig, die Anzahl gleichzeitiger Aufgaben zu begrenzen, die zu einem bestimmten Zeitpunkt ausgeführt werden können, um eine Drosselung zu erreichen. Dies ist besonders nützlich, wenn Sie mehrere API-Aufrufe durchführen oder große Datenmengen verarbeiten.
Die bereitgestellte ThrottleTasksAsync-Erweiterungsmethode löst diese Situation. Es akzeptiert eine Aufzählung von Projekten, eine maximale Anzahl gleichzeitiger Aufgaben und eine Aufgabenerstellungsfunktion. Es nutzt BlockingCollection und SemaphoreSlim, um die Drosselung zu erzwingen.
<code class="language-c#">public static async Task<result_t> ThrottleTasksAsync<enumerable_t, result_t>( this IEnumerable<enumerable_t> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, Func<enumerable_t, Task> taskToRun) { // ... }</code>
Diese Methode führt die Drosselung in einem separaten Thread aus und verwendet SemaphoreSlim, um die Anzahl gleichzeitiger Aufgaben zu steuern. Außerdem wird Parallel.ForEach verwendet, um eine Parallelisierung innerhalb eines bestimmten Parallelitätsgrads zu erreichen.
Während die ThrottleTasksAsync-Methode eine Lösung bietet, bietet der TPL-Datenfluss einen eleganteren Ansatz. Insbesondere können die Klassen TransformBlock
<code class="language-c#">var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 }); var buffer = new BufferBlock<HttpResponse>(); downloader.LinkTo(buffer);</code>
Durch die Verknüpfung eines TransformBlocks mit einem BufferBlock wird die Blockvervollständigung nicht durch die Verfügbarkeit des Verbrauchers blockiert. Dadurch kann der Pufferblock HttpResponse-Objekte sammeln, wenn er generiert wird, und das Programm kann warten, bis der Downloader abgeschlossen ist, bevor es die Antwort verarbeitet.
Das obige ist der detaillierte Inhalt vonWie kann ich asynchrone Aufgaben in C# drosseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!