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
Susan SarandonOriginal
2025-01-22 03:21:08194Durchsuche

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>

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>

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>

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!

Stellungnahme:
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