2015-07-22 130 views
6

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

当我尝试使用

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

我得到一个编译错误

无法隐式转换类型 '无效' 到 '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; 
    }); 
} 
+0

能否请您澄清[WhenAll]什么样的MSDN的一部分(https://msdn.microsoft.com/en-us/library/hh194766%28v=vs.110%29.aspx)不明确?会使问题更容易回答。 –

+0

其实没有一篇文章不清楚。什么是不明确的是这个空白来自哪里。 – user3373870

+0

我看到了 - 正如Mike Hixson指出的那样,您有'Task'(任务不返回值)列表而不是'Task ' - 因此等待'void'中的结果。通常你只是不使用快捷数组语法指定类型来避免这样的问题 - “ask.WhenAll(new [] {t,t2})...'。或者正确使用类型化的列表/任务数组,如MSDN示例 - 'var tasks = new List >();'。 –

回答

5

看起来像使用的是不返回值的WaitAll()的重载。如果您进行以下更改,它应该可以工作。

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

或者仅仅是'List [] all = await Task.WhenAll(t,t2).ConfigureAwait(false);' –

2

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

当在的await表达式中使用,任务将是“展开“转换为其结果类型,这意味着”全部“变量的类型应为List<string>[]