簡體   English   中英

動作塊<T> vs Task.WhenAll

[英]ActionBlock<T> vs Task.WhenAll

我想知道並行執行多個異步方法的推薦方法是什么?

在 System.Threading.Tasks.Dataflow 中,我們可以指定最大並行度,但無界可能也是 Task.WhenAll 的默認值?

這個:

var tasks = new List<Task>();
foreach(var item in items)
{
    tasks.Add(myAsyncMethod(item));
}
await Task.WhenAll(tasks.ToArray());

或者:

var action = new ActionBlock<string>(myAsyncMethod, new ExecutionDataflowBlockOptions
        {
            MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded,
            BoundedCapacity = DataflowBlockOptions.Unbounded,
            MaxMessagesPerTask = DataflowBlockOptions.Unbounded
        });
foreach (var item in items) { }
{
     action.Post(item);
}
action.Complete();

await action.Completion;

我想知道並行執行多個異步方法的推薦方法是什么?

旁注:實際上不是parallel ,而是concurrent

在 System.Threading.Tasks.Dataflow 中,我們可以指定最大並行度,但無界可能也是 Task.WhenAll 的默認值?

正如有人評論的, Task.WhenAll只加入現有的任務; 當您的代碼到達Task.WhenAll ,所有並發決策都已經完成。

您可以使用SemaphoreSlim東西來限制普通的異步代碼。

是直接使用異步並發還是 TPL Dataflow 的決定取決於周圍的代碼。 如果這個並發操作只是異步調用一次,那么異步並發是最好的選擇; 但如果此並發操作是數據“管道”的一部分,那么 TPL Dataflow 可能更合適。

這兩種方法都是可以接受的,選擇應該由您的需求決定,因為您可以看到 Dataflow 為您提供了很多可配置性,否則您在直接使用 Tasks 時必須手動實現這些可配置性。

請注意,在這兩種情況下,任務池都將負責排隊和運行任務,因此行為應保持不變。

Dataflow 擅長將可組合的異步操作組鏈接在一起,而使用任務可以提供更細粒度的控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM