我有一个程序需要执行以下指令:
目前,我的解决方案如下:
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 上执行的线程数。我不知道在这里用什么。当然,这取决于用于并行化任务的解决方案,因此任何输入将不胜感激。
您还可以在存储库任务中使用“ContinueWith”,它看起来像这样(未检查语法):
foreach (var item in items)
{
var repoTask = _updateRepository.AsyncGetChangedEntities(someInt, someGuid, item);
tasks.Add(repoTask.ContinueWith((t)=> _updateRepository.AsyncGetChangedEntities(someInt, someGuid, t.Result)); ;
}