【发布时间】:2016-04-30 15:32:04
【问题描述】:
我有两组任务,每组都有不同的结果类型:
IEnumerable<Task<T1>> set1 = GetTasksOfT1();
IEnumerable<Task<T2>> set2 = GetTasksOfT2();
现在我想在一行中等待两个集合,但我必须使用演员表投射 set1:
await Task.WhenAll(set1.Select(p => p as Task).Concat(set2));
那是因为如果我不使用强制转换,我会收到此错误:
IEnumerable<Task<T1>>' does not contain a definition for 'Concat'
and the best extension method overload 'Queryable.Concat<Task<T2>>(IQueryable<Task<T2>>, IEnumerable<Task<T2>>)'
requires a receiver of type 'IQueryable<Task<T2>>'
这很明显。
那么有没有办法在不强制转换的情况下使用单个WhenAll()?
编辑: 返回类型 T1 和 T2 很重要 - 我在等待任务后使用它们:
//After await Task.WhenAll(...):
var t1Results = await set1; // all set1 Tasks are completed by now
var t2Results = await set2; // same
DoSomethingWithResults(t1Results, t2Results);
【问题讨论】:
-
T1和T2是否都遵循通用接口? -
@Clockwork-Muse 请看我的编辑。但是,使用阻塞方法
Task.WaitAll()是一个非常糟糕的建议。 -
@Shay__ - 你是对的,这是个坏建议。
标签: c# generics async-await task-parallel-library task