Я хотел бы знать, каков рекомендуемый способ параллельного выполнения нескольких асинхронных методов?
в System.Threading.Tasks.Dataflow мы можем указать максимальную степень параллелизма, но unbounded, вероятно, используется по умолчанию и для 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;
Task.WhenAll
не имеет ничего общего с параллельным выполнением задач - любые решения об использовании, например. потоки пула потоков, параллелизм и т. д. происходят внутриmyAsyncMethod
, который (предположительно) возвращает горячиеTask
s. - person Damien_The_Unbeliever   schedule 16.05.2016BoundedCapacity = DataflowBlockOptions.Unbounded
по умолчанию. Включив его явно в параметры, вы открываете возможность того, что вы или кто-то другой в будущем решит настроить его на лучшее значение. И тогда ваша программа начнет вести себя странно, и вы потратите полтора дня на то, чтобы понять, почему. - person Theodor Zoulias   schedule 30.10.2019Post
отбрасывает элементы на пол, когда принимающий блок отказывается их принимать, потому что его буфер переполнен. Чтобы избежать этой неприятной ситуации, лучше проявить инициативу и использоватьawait action.SendAsync(item)
илиaction.SendAsync(item).Wait()
, если вы не находитесь внутри асинхронного метода. Накладные расходы наSendAsync
незначительно. - person Theodor Zoulias   schedule 30.10.2019