Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 即使有';只有一项,使用async/await和Task.whalll_C#_.net_Asynchronous_Async Await_Task - Fatal编程技术网

C# 即使有';只有一项,使用async/await和Task.whalll

C# 即使有';只有一项,使用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

我的代码怎么了?即使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;
     } 
公共异步任务进程(字符串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);
}