从Task.WhenAll获取结果

本文关键字:结果 获取 WhenAll Task | 更新日期: 2023-09-27 18:04:08

我有多个任务返回相同的对象类型,我想使用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>>

两个任务都在调用类似this的方法。

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

从Task.WhenAll获取结果

看起来你正在使用不返回值的WaitAll()的过载。如果您做了以下更改,它应该可以工作。

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

WhenAll的返回类型是一个任务,其结果类型是单个任务的结果类型的数组,在您的示例中是Task<List<string>[]>

当在await表达式中使用时,任务将被"解包装"为其结果类型,这意味着您的"all"变量的类型应该是List<string>[]