2

今私は3つの方法を持っています

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

async キーワードを使用して呼び出しを並列化し、待機したいと考えています。方法が本当にわかりません。以下は、GetMethod の概要です...どこに async キーワードを置きますか? タスクを作成する場所 async js lib と同じくらい簡単にやりたいです。https://github.com/caolan/async/

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

2 に答える 2

8

3 つのメソッドすべてを一度に呼び出したい場合は、非同期バージョンを呼び出す必要があります。

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;

最初の 3 行は非同期操作を開始し、それぞれが を返しますTask<IList<T>>。呼び出しはawait完了を「待機」し、実際の値を返します。

これらを同じ行に書くこともできますが、上記のように分割すると、3 つの非同期操作すべてがすぐに開始され、返された結果がフェッチされます。それらを同じ行、つまり:IList<Car> cars = await Service.Get...に配置すると、操作は非同期のままになりますが、最初の操作が完了するまで 2 番目の操作は開始されません。

メソッドを自分で作成している場合は、呼び出しをラップする必要があります。既存の非同期メソッドのオプションがない場合は、ラップできます。

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 に答える