gpt4 book ai didi

c# - 即使只有一项,也会触发两项任务,使用 async/await 和 Task.WhenAll

转载 作者:太空狗 更新时间:2023-10-30 00:07:29 24 4
gpt4 key购买 nike

我这里的代码有什么问题?即使当 items.count 仅为 1 时,DoSomething 方法也会被调用两次,并且计数器等于 2。我是否没有正确构造等待或者我是否错误地使用了 WhenAll?

public async Task<int> Process(string id)
{
var items = await GetItemsAsync(id);
var counter = 0;

var tasks = items.Select(async item =>
{
if (await DoSomething(item))
counter++
});

if (tasks.Count() > 0)
await Task.WhenAll(tasks);

return counter;
}

最佳答案

基本上,您没有正确使用 Select。它很懒,记得吗?所以每次你迭代它(一次是 Count(),一次是 WhenAll)......它会再次调用你的委托(delegate)。

修复很简单:只需具体化查询,例如使用 ToList():

var tasks = items.Select(async item =>
{
if (await DoSomething(item))
{
counter++
}
}).ToList();

这样您就可以创建任务一次。事实上,tasks.Count() 现在根本不需要迭代,因为它已针对使用 Count 属性进行了优化。但我仍然会使用 Any() 来代替:

if (tasks.Any())
{
await Task.WhenAll(tasks);
}

(顺便说一句,我强烈建议始终使用大括号。它更能抵抗错误...)

关于c# - 即使只有一项,也会触发两项任务,使用 async/await 和 Task.WhenAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com