我用下面的方法来异步执行一些任务,并在同一时间:异步任务是两次评估
public async Task<Dictionary<string, object>> Read(string[] queries)
{
var results = queries.Select(query => new Tuple<string, Task<object>>(query, LoadDataAsync(query)));
await Task.WhenAll(results.Select(x => x.Item2).ToArray());
return results
.ToDictionary(x => x.Item1, x => x.Item2.Result);
}
我想要的方法来调用LoadDataAsync
用于在同一时间阵列中的每个字符串,然后等到所有任务完成并返回结果。
- 如果我像这样运行的方法,它在最后
.Result
属性的getter调用LoadDataAsync
两次,每次项目,一旦在await ...
线,并一次。 - 如果我删除
await ...
行,Visual Studio会警告说整个方法可以并行运行,因为方法内部没有调用await
。
我在做什么错?
有没有更好(更短)的方法来做同样的事情?
嗯,当然他们是 - 你在枚举结果查询两次。如果首先使用'queries ... ToArray()',它将起作用。你枚举两次'queries',每次都做一个新的'LoadDataAsync'。 – Luaan 2014-09-30 15:38:16
我对你的代码示例有些困惑。数组'items'被忽略,并使用一个叫做'queries'的神秘全局变量。你发布了一个不完整的代码示例吗? – 2014-09-30 15:46:48
是的,对不起。更正它。不应该在SO内进行代码编辑。 – cheeesus 2014-09-30 17:16:01