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

问题描述 投票:0回答:2

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

这是我的代码:

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);

问题是,由于

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

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

c# asynchronous task
2个回答
6
投票

在将它们放入数组之前,您必须将它们存储为

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,请考虑将

Task.WhenAll
await
一起使用。否则
Task.Factory.ContinueWhenAll
是另一种选择。


0
投票

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

 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);
    }
}

需要一个

© www.soinside.com 2019 - 2024. All rights reserved.