2

现在我有3种方法

    IList<Car> cars = Service.GetCars(20);
    IList<Shoe> shoes = Service.GetShoes(20);
    IList<Bike> bike = Service.GetBikes(20);

我想用异步关键字并行调用并等待。我真的不明白该怎么做。下面是一个 GetMethod 的摘要......你把 async 关键字放在哪里?我在哪里创建任务?我想做和异步 js lib 一样简单。https://github.com/caolan/async/

   public IList<Car> GetCars(int num){
        return repository.GetCars(num);
   }
4

2 回答 2

8

如果要一次调用所有三个方法,则需要调用异步版本:

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 线程围绕同步代码包装异步调用。一般来说,这不是一个好的设计,因为最好让同步代码保持同步并将其包装在使用点,而不是“隐藏”它并不是真正异步的事实。

于 2013-05-24T21:44:34.197 回答
0

为每个方法创建一个任务,像这样等待它们:

Task stuff1 = Task.Run(() => Service.GetStuff1());
...
Task.WaitAll(stuff1, stuff2, stuff3);
于 2013-05-24T21:44:32.683 回答