Как запустить два списка задач с разными типами возврата одновременно - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь запустить два списка асинхронных задач (с разными типами возврата) одновременно и не могу понять, как это сделать.

public void LoadPets()
{
    ServiceClient service = new ServiceClient();

    List<string> catNames = ...;
    List<string> dogNames = ...;

    List<Task<Cat>> catTasks = catNames.Select(x => service.GetCatAsync(x.Name));
    List<Task<Dog>> dogTasks = dogNames.Select(x => service.GetDogAsync(x.Name));

    foreach(object pet in Task.WhenAll(catTasks.Concat(dogTasks)).Result)
    {
       // Cast object
       // Do work with object.
    }
}

Приведенный выше код не работает, потому что вы не можете объединить различные типы задач. Но это те типы, которые возвращаются из веб-службы.

Мне нужно запустить их одновременно, так как получение кошек занимает около 3 секунд, как и получение собак. В итоге я жду в общей сложности 6 секунд, так как они происходят одна за другой.

Любое понимание того, как я могу запустить оба списка задач одновременно?

Ответы [ 2 ]

4 голосов
/ 29 марта 2019

Обратите внимание, что Task<T> на самом деле наследуется от неуниверсального Task, поэтому вы переводите все свои общие задачи в базовый класс, что-то вроде этого:

var nonGenericTasks = catTasks
    .Cast<Task>()
    .Concat(dogTasks.Cast<Task>());

await Task.WhenAll(nonGenericTasks);
1 голос
/ 29 марта 2019

Вы можете попробовать следующее:

 var tasks = new List<Task>()
 { 
     SomeMethod1Async(arg1, arg2),
     SomeMethod2Async(arg1)
 };

 await Task.WhenAll(tasks.ToArray());

 var result1 = ((Task<Result1>)tasks[0]).Result;
 var result2 = ((Task<Result2>)tasks[1]).Result;

Где Result1 и Result2 являются типами повторного запуска SomeMethod1Async и SomeMethod2Async.

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