C # как совместить 2 задачичерез союз и возвратное задание - PullRequest
0 голосов
/ 01 октября 2018

Прямо сейчас у меня 2 Task<IEnumerable<T>>, назовите их TaskA и TaskB.Мне нужно передать TaskC асинхронному методу.В этом методе он ожидается, и полученный IEnumerable работает, и я не могу изменить этот метод.

Что я хочу сделать, так это как-то сказать «когда ожидают TaskC, тогда ждут TaskA и UNIONэти результаты с ожидаемым результатом TaskB ".

Если бы IEnumerables не были обернуты в Задачи, конечно, я бы просто сделал:

var ResultC = ResultA.Union(ResultB);

Как я могу выполнить это, все еще лениво оценивая TaskA и TaskB

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Если 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, а затем принимайте их объединение».

0 голосов
/ 01 октября 2018

Ожидайте оба с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...