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 スレッドを使用して非同期コードを同期コードにラップしているためです。一般に、これは適切な設計ではありません。同期コードが実際には非同期ではないという事実を「隠す」よりも、同期コードの同期を残して使用ポイントでラップする方がよいからです。