Heim > Backend-Entwicklung > C++ > Wie kann ich asynchrone Aufgaben in C# drosseln?

Wie kann ich asynchrone Aufgaben in C# drosseln?

Susan Sarandon
Freigeben: 2025-01-22 20:26:10
Original
968 Leute haben es durchsucht

How Can I Throttle Asynchronous Tasks in C#?

Asynchrone Aufgaben begrenzen

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.

ThrottleTasksAsync-Methode

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>
Nach dem Login kopieren

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.

TPL-Datenfluss als Alternative

Während die ThrottleTasksAsync-Methode eine Lösung bietet, bietet der TPL-Datenfluss einen eleganteren Ansatz. Insbesondere können die Klassen TransformBlock verwendet werden, um maximale Parallelitätsgrenzen für die Aufgabenausführung zu definieren.

<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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage