我正在尝试异步完成四个任务,当它们全部完成时,将它们附加到一个对象并返回它。
这是我的代码:
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>[]
这样的类型。但是,上述四个任务中的每一个都返回不同的类型。
如何等到所有任务完成后再将它们添加到我的组合对象并返回它?
在将它们放入数组之前,您必须将它们存储为
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
是另一种选择。
一如既往地迟到......我目前正在使用这个扩展方法
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);
}
}
需要一个