如何同时运行具有不同返回类型的两个任务列表

时间:2019-03-29 18:27:19

标签: c# .net async-await

我正在尝试同时运行两个异步任务列表(具有不同的返回类型),但我还不太清楚该怎么做。

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.
    }
}

上面的代码不起作用,因为您无法连接不同类型的任务。但是这些是从Web服务返回的类型。

我需要同时运行它们,因为养猫大约需要3秒钟,养狗也需要3秒钟。因此,自从它们一次又一次发生以来,我总共等待了6秒钟。

是否有关于如何同时运行两个任务列表的见解?

2 个答案:

答案 0 :(得分:4)

请注意,Task<T>实际上是从非泛型Task继承的,因此您将所有泛型任务都转换为基类,如下所示:

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

await Task.WhenAll(nonGenericTasks);

答案 1 :(得分:1)

您可以尝试以下操作:

 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的重新运行类型。