我正在尝试同时运行两个异步任务列表(具有不同的返回类型),但我还不太清楚该怎么做。
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秒钟。
是否有关于如何同时运行两个任务列表的见解?
答案 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的重新运行类型。