如果要一次调用所有三个方法,则需要调用异步版本:
var carTask = Service.GetCarsAsync(20);
var showTask = Service.GetShoesAsync(20);
var bikeTask = Service.GetBikesAsync(20);
IList<Car> cars = await carTask;
IList<Shoe> shoes = await shoeTask;
IList<Bike> bike = await bikeTask;
前三行启动异步操作,每个操作都返回一个Task<IList<T>>. 这些await调用“等待”它们的完成并返回实际值。
您可以将它们写在相同的行上,但如上所述拆分它们会导致所有三个异步操作立即开始,然后在它们返回时获取结果。如果将它们放在同一行,即:IList<Car> cars = await Service.Get...,则操作将保持异步,但第二个操作将在第一个操作完成之前开始。
如果您自己编写方法,则需要包装调用。如果您没有现有异步方法的选项,则可以将其包装:
public Task<IList<Car>> GetCars(int num)
{
return Task.Run(() => repository.GetCars(num));
}
但是,如果您repository支持异步方法,最好直接使用它们而不是调用Task.Run,因为这实际上是通过使用 ThreadPool 线程围绕同步代码包装异步调用。一般来说,这不是一个好的设计,因为最好让同步代码保持同步并将其包装在使用点,而不是“隐藏”它并不是真正异步的事实。