使用 Task.WhenAll 并行化 .NET 任务的最佳方法

问题描述 投票:0回答:1

我有一个程序需要执行以下指令:

  1. 通过 Http 请求检索项目列表
  2. 对于每个检索到的项目,使用该项目作为参数执行另一个 Http 请求

目前,我的解决方案如下:

var items = await _repository.GetItems(someInt, someGuid);
var itemsUpdated = new ConcurrentDictionary<Item, ConcurrentDictionary<Dto,TransactionType>>();

foreach (var item in items)
{
    _ = itemsUpdated.TryAdd(item, 
        (await _updateRepository.AsyncGetChangedEntities(someInt, someGuid, item))!);
}

在我的应用程序中,我在很多地方使用 Task.WhenAll() 来并行化任务以提高性能。我只是不知道如何在这里使用它。有人可以帮忙吗?

我尝试了以下方法但陷入困境:

var items = await _repository.GetItems(someInt, someGuid);
var itemsUpdated = new ConcurrentDictionary<Item, ConcurrentDictionary<Dto,TransactionType>>();

var tasks = new List<Task>();

foreach (var item in items)
{
    tasks.Add(_updateRepository.AsyncGetChangedEntities(someInt, someGuid, item));

    //_ = itemsUpdated.TryAdd(item, 
    //    (await _updateRepository.AsyncGetChangedEntities(someInt, someGuid, item))!);
}

await Task.WhenAll(tasks);
// how to get the updatedItems from the tasks and insert
// by item in the itemsUpdated ConcurrentDictionary

另外,既然我们谈论的是提高绩效;在初始化 ConcurrentDictionary 时,我希望传递预期长度以避免重新初始化支持数组。但是,构造函数还要求需要在 ConcurrentDictionary 上执行的线程数。我不知道在这里用什么。当然,这取决于用于并行化任务的解决方案,因此任何输入将不胜感激。

c# asynchronous concurrency parallel-processing task
1个回答
0
投票

您还可以在存储库任务中使用“ContinueWith”,它看起来像这样(未检查语法):

foreach (var item in items)
{
   var repoTask = _updateRepository.AsyncGetChangedEntities(someInt, someGuid, item);
   tasks.Add(repoTask.ContinueWith((t)=> _updateRepository.AsyncGetChangedEntities(someInt, someGuid, t.Result));    ;
}
© www.soinside.com 2019 - 2024. All rights reserved.