Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何同时运行具有不同返回类型的两个任务列表_C#_.net_Async Await - Fatal编程技术网

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语句的末尾添加一个收费表,然后一切都正常了。谢谢你的帮助!