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



我正在尝试同时运行两个异步任务列表(具有不同的返回类型),但无法弄清楚如何做到这一点。

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 秒,养狗也需要。所以我最终总共等待了 6 秒,因为它们一个接一个地发生。

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

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

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

您可以尝试以下操作:

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

最新更新