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

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

Susan Sarandon
發布: 2025-01-22 03:21:08
原創
155 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板