从Task.WhenAll获取结果

22

我有多个返回相同类型对象的任务,我想使用 Task.WhenAll(new[]{t1,t2,t3}); 调用它们并读取结果。

但是当我试着使用时

Task<List<string>> all = await Task.WhenAll(new Task[] { t, t2 }).ConfigureAwait(false);

我遇到了编译错误

无法隐式转换类型“void”为 'System.Threading.Tasks.Task<System.Collections.Generic.List<string>>

两个任务都在调用类似于这样的方法。

private Task<List<string>> GetFiles(string path)
{
    files = new List<string>();
    return  Task.Run(() =>
    {
       //remove for brevity 
        return files;
    });
}

请问您能否澄清MSDN WhenAll示例的哪一部分不清楚?这样问题会更容易回答。 - Alexei Levenkov
1
实际上,这篇文章都不是很清楚。不清楚的是这个空洞是从哪里来的。 - user3373870
正如Mike Hixson所指出的那样,您有一个“Task”列表(不返回值的任务),而不是“Task<String>”,因此等待结果为“void”。通常,您只需使用快捷数组语法而不指定类型即可避免此类问题——“ask.WhenAll(new[] { t, t2 })...”。或者使用正确类型的任务列表/数组,就像MSDN示例中显示的那样——“var tasks = new List<Task<long>>();”。 - Alexei Levenkov
^ 这是真正的答案。 - mwilson
2个回答

16

看起来你正在使用不返回值的WaitAll()重载。如果你做出以下更改,它应该能正常工作。

List<string>[] all = await Task.WhenAll(new Task<List<string>>[] { t, t2 })
                               .ConfigureAwait(false);

9
或者只需使用以下代码:List<string>[] all = await Task.WhenAll(t, t2).ConfigureAwait(false); - Stephen Cleary

4

WhenAll的返回类型是一个任务,其结果类型是各个任务的结果类型的数组,在你的情况下是Task<List<string>[]>

如果在await表达式中使用,则任务将被“解包”为其结果类型,这意味着您的“全部”变量的类型应为List<string>[]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接