提问人:user1477388 提问时间:9/27/2014 更新时间:11/17/2023 访问量:1617
如何等待不同类型的任务?
How to wait for tasks of varying types?
问:
我正在尝试异步完成四个任务,当它们全部完成后,将它们附加到一个对象并返回它。
这是我的代码:
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>[]
如何等到所有任务完成后再将它们添加到我的组合对象并返回它?
答:
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.WhenAll
await
Task.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 个以上的异步调用
上一个:如何等待不同类型的任务?
评论
(tasks[0] as Task<MyType>).Result