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

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

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

最佳答案

请注意 Task<T> 实际上继承自非泛型 Task 所以你把你所有的通用任务都投给了基类,像这样:

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

await Task.WhenAll(nonGenericTasks);

关于c# - 如何同时运行两个具有不同返回类型的任务列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55423552/

相关文章:

c# - 为什么这个方法会导致无限循环?

asp.net - 我迷路了。 ASP.NET MVC 5发生了什么?

c# - 更新 .NET 框架导致 SQL 超时

.net - Nancy 应用程序错误被 OWIN 吞没?

c# - MVC3 - 在 html.helper 中获取数据属性

c# - TDS 流中的协议(protocol)错误 - 错误

c# - 如何保护 Web API 免受数据检索而不是来自资源所有者的数据检索

rust - Rust如何实现await关键字?

javascript - 如何在异步/等待语法中使用 Promise.prototype.finally()?

c# - 新的 C# 异步功能是否在编译器中严格实现