如何等待不同类型的任务?

How to wait for tasks of varying types?

提问人:user1477388 提问时间:9/27/2014 更新时间:11/17/2023 访问量:1617

问:

我正在尝试异步完成四个任务,当它们全部完成后,将它们附加到一个对象并返回它。

这是我的代码:

Task[] tasks = new Task[4];
tasks[0] = wtData.GetHFServiceData(wtTransfreeeId);
tasks[1] = wtData.GetTLServicesData(wtTransfreeeId);
tasks[2] = wtData.GetHMAServiceData(wtTransfreeeId);
tasks[3] = wtData.GetHSServiceData(wtTransfreeeId);

Task.WaitAll(tasks);

问题是,由于没有 Result 方法,我必须定义一个类似 .但是,上述四个任务中的每一个都返回不同的类型。Task[]Task<MyType>[]

如何等到所有任务完成后再将它们添加到我的组合对象并返回它?

C# 异步 任务

评论

1赞 Ben Voigt 9/27/2014
你在找吗?(tasks[0] as Task<MyType>).Result
0赞 user1477388 9/27/2014
可能,我接下来将不得不尝试。谢谢。
0赞 Theodor Zoulias 11/18/2023
相关:等待具有不同结果的多个任务。也可能是这样:在使用 Task.WhenAll() 从等待的任务分配时,避免检查条件两次

答:

6赞 Sriram Sakthivel 9/27/2014 #1

您必须像将它们放入数组之前一样存储它们。Task<T>

Task<YourType1> task1 = wtData.GetHFServiceData(wtTransfreeeId);
Task<YourType2> task2 = wtData.GetTLServicesData(wtTransfreeeId);
...
Task[] tasks = new Task[]{task1, task2, ...};
Task.WaitAll(tasks);

var result1 = task1.Result;//Access the individual task's Result here
...

避免阻塞等待,如果使用的是 .Net 4.5,请考虑使用 with。否则是另一种选择。Task.WhenAllawaitTask.Factory.ContinueWhenAll

评论

0赞 user1477388 9/27/2014
谢谢,似乎有效。有没有办法像这样内联地做这件事?我试过了,但它不起作用。Task[] tasks = new Task[] { (Task<List<HFData>>)wtData.GetHFServiceData(wtTransfreeeId) };
0赞 Sriram Sakthivel 9/27/2014
的返回类型是什么?你得到什么错误?GetHFServiceData
0赞 user1477388 9/27/2014
返回类型是,错误是当我尝试使用 is 访问结果时,说 Task[] 没有这样的方法。Task<List<HFData>>tasks[0].Result
1赞 Sriram Sakthivel 9/27/2014
不,如果它们是不同的类型,你就不能这样做。正如我向你展示的那样,你必须声明单独的变量。
1赞 Ben Voigt 9/27/2014
您应该能够将它们很好地放入数组中,因为它们具有通用的基本类型。但是,获取属性需要特定的类型。Result
0赞 ScottBarnesBass 11/17/2023 #2

一如既往地迟到......我目前正在使用此扩展方法

public static class TaskExtensions
{
    public static async Task<(T1, T2)> WhenAll<T1, T2>(this (Task<T1> , Task<T2>) tasks )
        where T1 : class 
        where T2 : class 
    {
        await Task.WhenAll(tasks.Item1, tasks.Item2);
        return (tasks.Item1.Result, tasks.Item2.Result);
    }
}
var (response1, response2)
    = await (_service1.GetTheThing(), _service2.GetTheOtherThing())
    .WhenAll();

需要更多方法来运行 2 个以上的异步调用