等待多个任务结果不同
我有3个任务:
private async Task<Cat> FeedCat() {} private async Task<House> SellHouse() {} private async Task<Tesla> BuyCar() {}
他们都需要运行之前我的代码可以继续,我也需要结果。 没有一个结果有任何共同之处
我如何打电话,等待3个任务完成,然后得到结果?
在使用WhenAll
,您可以单独将结果拉出来await
:
var catTask = FeedCat(); var houseTask = SellHouse(); var carTask = BuyCar(); await Task.WhenAll(catTask, houseTask, carTask); var cat = await catTask; var house = await houseTask; var car = await carTask;
你也可以使用Task.Result
(因为你知道这一点,他们都已经成功完成)。 不过,我build议使用await
因为它显然是正确的,而Result
可能会在其他情况下导致问题。
开始他们之后,分别await
三项任务。
var catTask = FeedCat(); var houseTask = SellHouse(); var carTask = BuyCar(); var cat = await catTask; var house = await houseTask; var car = await carTask;
如果您使用的是C#7,则可以使用像这样的方便包装方法…
public static class TaskEx { public static async Task<(T1, T2)> WhenAll<T1, T2>(Task<T1> task1, Task<T2> task2) { await Task.WhenAll(task1, task2); return (task1.Result, task2.Result); } }
…当你想用不同的返回types等待多个任务时,使用这种方便的语法。 当然,你需要为不同数量的任务进行多重重载。
var (someInt, someString) = await TaskEx.WhenAll(GetIntAsync(), GetStringAsync());
你可以将它们存储在任务中,然后等待它们:
var catTask = FeedCat(); var houseTask = SellHouse(); var carTask = BuyCar(); await Task.WhenAll(catTask, houseTask, carTask); Cat cat = await catTask; House house = await houseTask; Car car = await carTask;
你可以使用Task.WhenAll
或者Task.WaitAll
,这取决于你是否希望线程等待。 看看这两个链接的解释。
WaitAll与WhenAll
使用Task.WhenAll
然后等待结果:
var tCat = FeedCat(); var tHouse = SellHouse(); var tCar = BuyCar(); await Task.WhenAll(tCat, tHouse, tCar); Cat cat = await tCat; House house = await tHouse; Tesla car = await tCar; //as they have all definitely finished, you could also use Task.Value.