首頁 >後端開發 >C++ >如何在 C# 中有效率地使用 Async/Await 執行多個平行任務?

如何在 C# 中有效率地使用 Async/Await 執行多個平行任務?

Susan Sarandon
Susan Sarandon原創
2025-01-22 03:21:08189瀏覽

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

C#中高效使用Async/Await處理多個任務

場景

假設使用一個非同步API客戶端,它會傳回Task或Task,類似下列範例:

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

目標是同時啟動多個非同步任務並等待它們完成。兩種常用的方法是Parallel.ForEach和Task.WaitAll。

現有方法的不足

雖然Parallel.ForEach和Task.WaitAll都嘗試並行執行任務,但它們有其限制。

  • Parallel.ForEach with Wait(): 儘管任務並發執行,但Wait()呼叫會阻塞每個參與的執行緒。因此,如果任務中的網路呼叫需要2秒,則每個執行緒在此期間保持空閒,並降低效率。
  • Task.WaitAll: 同樣,此方法會阻塞目前線程,直到任務完成。在此阻塞期間,線程無法處理其他任務。

推薦方法

為了克服這些限制,我們建議使用Task.WhenAll,它可以非同步並行執行任務。以下程式碼示範了它的用法:

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

在這種情況下,由於任務完成後沒有後續操作,因此不需要await。以下簡化的程式碼就夠了:

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

有關這些方法的更多見解和比較,請參閱綜合部落格文章:「如何以及在何處使用ASP.NET Web API進行並發非同步I/O」。

以上是如何在 C# 中有效率地使用 Async/Await 執行多個平行任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn