C# 如何同时运行具有不同返回类型的两个任务列表
我试图同时运行两个具有不同返回类型的异步任务列表,但不太清楚如何执行C# 如何同时运行具有不同返回类型的两个任务列表,c#,.net,async-await,C#,.net,Async Await,我试图同时运行两个具有不同返回类型的异步任务列表,但不太清楚如何执行 public void LoadPets() { ServiceClient service = new ServiceClient(); List<string> catNames = ...; List<string> dogNames = ...; List<Task<Cat>> catTasks = catNames.Select(x
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秒钟,因为它们一个接一个地发生
关于如何同时运行这两个任务列表有什么见解吗?请注意,实际上继承自非泛型,因此您将所有泛型任务强制转换为基类,如下所示:
var nonGenericTasks = catTasks
.Cast<Task>()
.Concat(dogTasks.Cast<Task>());
await Task.WhenAll(nonGenericTasks);
请注意,实际上继承自非泛型,因此将所有泛型任务强制转换为基类,如下所示:
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的重新运行类型。您可以尝试以下操作:
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的retrun类型。对Cat和Dog使用公共基类型或接口。对Cat和Dog使用公共基类型或接口。这允许我连接它们。但是我不能这样做。Result,我如何得到结果呢?你只需在原始任务中循环并对每个任务调用。Result。当我这样做时,它似乎会发出两次请求。WhenAll会按我的意愿,发出所有请求。但是,当我循环遍历这些项并执行x.Result时,它再次运行请求,但这次是在循环遍历每个项时同步运行的。另外,我忘了在做这件事的时候提到我没有异步方法,所以我没有等待响应,而是等待响应。我成了延期执行死刑的受害者。我不得不在select语句的末尾添加一个收费表,然后一切都正常了。谢谢你的帮助!这允许我连接它们。但是我不能这样做。Result,我如何得到结果呢?你只需在原始任务中循环并对每个任务调用。Result。当我这样做时,它似乎会发出两次请求。WhenAll会按我的意愿,发出所有请求。但是,当我循环遍历这些项并执行x.Result时,它再次运行请求,但这次是在循环遍历每个项时同步运行的。另外,我忘了在做这件事的时候提到我没有异步方法,所以我没有等待响应,而是等待响应。我成了延期执行死刑的受害者。我不得不在select语句的末尾添加一个收费表,然后一切都正常了。谢谢你的帮助!