C# 即使有';只有一项,使用async/await和Task.whalll
我的代码怎么了?即使items.count仅为1,DoSomething方法也会被调用两次,并且计数器等于2。我是否没有正确地组织等待,或者我是否错误地使用了WhenAllC# 即使有';只有一项,使用async/await和Task.whalll,c#,.net,asynchronous,async-await,task,C#,.net,Asynchronous,Async Await,Task,我的代码怎么了?即使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
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;
}
公共异步任务进程(字符串id)
{
var items=await-GetItemsAsync(id);
var计数器=0;
变量任务=项。选择(异步项=>
{
如果(等待剂量测定(项目))
柜台++
});
如果(tasks.Count()>0)
等待任务。何时(任务);
返回计数器;
}
基本上,您使用的选择不正确。它很懒,记得吗?因此,每次迭代它(一次用于Count()
,一次用于whalll
)。。。它将再次呼叫您的代表
解决方法很简单:只需具体化查询,例如使用ToList()
:
这样就可以创建一次任务。事实上,tasks.Count()
现在根本不需要迭代,因为它已优化为使用Count
属性。但我仍然会使用Any()
:
if (tasks.Any())
{
await Task.WhenAll(tasks);
}
(顺便说一句,我强烈建议总是使用大括号。它更能防止bug…更具体地说,任务。Count()
会造成额外的“意外”iteration@JonSkeet非常感谢!或者,我也可以使用foreach循环将任务添加到(任务)列表中,对吗?@Prabhu:可以,但与只调用ToList
相比,这将是相当冗长的。。。
if (tasks.Any())
{
await Task.WhenAll(tasks);
}