首頁 >後端開發 >C++ >如何限制 C# 中的非同步任務?

如何限制 C# 中的非同步任務?

Susan Sarandon
Susan Sarandon原創
2025-01-22 20:26:101007瀏覽

How Can I Throttle Asynchronous Tasks in C#?

限制非同步任務

在非同步程式設計中,經常需要限制任何給定時間可以執行的並發任務數量以實現節流。這在進行多個 API 呼叫或處理大型資料集時尤其有用。

ThrottleTasksAsync 方法

提供的 ThrottleTasksAsync 擴充方法解決了這種情況。它接受項目的枚舉、最大並發任務數和任務創建函數。它利用 BlockingCollection 和 SemaphoreSlim 來強制執行節流。

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

此方法在單獨的執行緒上運行節流器,使用 SemaphoreSlim 來控制並發任務的數量。它也利用 Parallel.ForEach 來實現並行化,在指定的平行度內。

TPL 資料流作為替代方案

雖然 ThrottleTasksAsync 方法提供了一種解決方案,但 TPL 資料流提供了一種更優雅的方法。具體來說,TransformBlock 類別可用於定義任務執行的最大平行度限制。

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

透過將 TransformBlock 連結到 BufferBlock,區塊的完成不會被消費者的可用性阻塞。這允許緩衝區塊在生成時收集 HttpResponse 對象,並且程式可以在處理回應之前等待下載器的完成。

以上是如何限制 C# 中的非同步任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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