C#如何通过Union合并2 Task <ienumerable <t >>并返回任务

时间:2018-10-01 20:50:50

标签: c# linq asynchronous async-await

现在我有2个Task<IEnumerable<T>>,分别称为TaskA和TaskB。我需要将TaskC传递给异步方法。在该方法中,将等待它,并且对所得的IEnumerable进行操作,而我无法更改该方法。

我想做的是以某种方式说“当TaskC被等待时,然后等待TaskA,然后将这些结果与TaskB的等待结果结合起来”。

如果IEnumerables没有包装在Tasks中,我当然会做:

var ResultC = ResultA.Union(ResultB);

如何在仍然懒惰地评估TaskA和TaskB的同时完成此任务?

2 个答案:

答案 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);

这是DotNetFiddle

上的有效示例