Heim > Backend-Entwicklung > C++ > Wie kann ich Async/Await effizient für mehrere parallele Aufgaben in C# verwenden?

Wie kann ich Async/Await effizient für mehrere parallele Aufgaben in C# verwenden?

Susan Sarandon
Freigeben: 2025-01-22 03:21:08
Original
186 Leute haben es durchsucht

How Can I Efficiently Use Async/Await for Multiple Parallel Tasks in C#?

Verwenden Sie Async/Await effizient, um mehrere Aufgaben in C# zu erledigen

Szene

Angenommen, es wird ein asynchroner API-Client verwendet, der Task oder Task zurückgibt, ähnlich dem folgenden Beispiel:

<code class="language-csharp">static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
    await client.DeletePost(siteId, postId); // 调用API客户端
    Console.WriteLine("已删除帖子 {0}.", siteId);
}</code>
Nach dem Login kopieren

Das Ziel besteht darin, mehrere asynchrone Aufgaben gleichzeitig zu starten und auf deren Abschluss zu warten. Zwei häufig verwendete Methoden sind Parallel.ForEach und Task.WaitAll.

Mängel bestehender Methoden

Während Parallel.ForEach und Task.WaitAll beide versuchen, Aufgaben parallel auszuführen, weisen sie Einschränkungen auf.

  • Parallel.ForEach mit Wait(): Obwohl Aufgaben gleichzeitig ausgeführt werden, blockiert der Wait()-Aufruf jeden teilnehmenden Thread. Wenn also ein Netzwerkaufruf in einer Aufgabe 2 Sekunden dauert, bleibt jeder Thread während dieser Zeit im Leerlauf, was die Effizienz verringert.
  • Task.WaitAll: Auch hier blockiert diese Methode den aktuellen Thread, bis die Aufgabe abgeschlossen ist. Während dieser Sperrzeit kann der Thread keine anderen Aufgaben bearbeiten.

Empfohlene Methode

Um diese Einschränkungen zu überwinden, empfehlen wir die Verwendung von Task.WhenAll, das Aufgaben asynchron und parallel ausführen kann. Der folgende Code demonstriert seine Verwendung:

<code class="language-csharp">public async Task DoWork() {

    int[] ids = new[] { 1, 2, 3, 4, 5 };
    await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>
Nach dem Login kopieren

In diesem Fall ist Warten nicht erforderlich, da nach Abschluss der Aufgabe keine Folgevorgänge erfolgen. Der folgende vereinfachte Code reicht aus:

<code class="language-csharp">public Task DoWork() 
{
    int[] ids = new[] { 1, 2, 3, 4, 5 };
    return Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>
Nach dem Login kopieren

Weitere Einblicke und Vergleiche dieser Ansätze finden Sie im umfassenden Blogbeitrag: „How and Where to Use ASP.NET Web API for Concurrent Asynchronous I/O“.

Das obige ist der detaillierte Inhalt vonWie kann ich Async/Await effizient für mehrere parallele Aufgaben in C# verwenden?. 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