[英]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.