现在我有2个Task<IEnumerable<T>>
,分别称为TaskA和TaskB。我需要将TaskC传递给异步方法。在该方法中,将等待它,并且对所得的IEnumerable进行操作,而我无法更改该方法。
我想做的是以某种方式说“当TaskC被等待时,然后等待TaskA,然后将这些结果与TaskB的等待结果结合起来”。
如果IEnumerables没有包装在Tasks中,我当然会做:
var ResultC = ResultA.Union(ResultB);
如何在仍然懒惰地评估TaskA和TaskB的同时完成此任务?
答案 0 :(得分:6)
如果没有将
IEnumerables
包裹在Task
中,我当然会这样做:
var ResultC = ResultA.Union(ResultB);
如何在仍然懒惰地评估TaskA和TaskB的同时完成此任务?
请记住,await TaskA
是异步等待完成任务并提取其结果值的操作。所以你可以简单地说:
Task<IEnumerable<T>> resultA = whatever;
Task<IEnumerable<T>> resultB = whatever;
Func<Task<IEnumerable<T>>> getTaskC =
async () => (await resultA).Union(await resultB);
Task<IEnumerable<T>> resultC = getTaskC();
现在您手头有一个任务,代表“异步地等待A和B,然后将它们合并”的工作流程。
答案 1 :(得分:1)
与WhenAll
一起等待,然后将结果合并。
public async Task<IEnumerable<T>> GetUnion<T>(Task<IEnumerable<T>> a, Task<IEnumerable<T>> b)
{
await Task.WhenAll(a,b);
return a.Result.Union(b.Result);
}
并这样称呼它:
var results = await GetUnion(TaskA,TaskB);
上的有效示例