通常情况下我会这样做:
var cars = db.GetCarsAsync();
var dogs = db.GetDogsAsync();
var cats = db.GetCatsAsync();
await Task.WhenAll(cars , dogs , cats);
很简单,但是现在如何确保我最大限度地发挥依赖关系的异步能力:
var vet = await db.GetVetAsync(id);
var validDogTypeIds = vet.DogTypes.Select(d => d.Id).ToList();
var validCatTypeIds = vet.CatTypes.Select(d => d.Id).ToList();
var cars = db.GetCarsAsync();
var dogs = db.GetDogsAsync(validDogTypeIds);
var cats = db.GetCatsAsync(validCatTypeIds);
await Task.WhenAll(cars , dogs , cats);
由于操作需要兽医完成,所有数据库操作都处于暂停状态,而不仅仅是那些需要结果的操作。
(这是一个例子,请忽略简单关系可以解决这个问题的事实。)
答案 0 :(得分:2)
你可以在等待其中任何一个之前,通过实例化两个任务(在async
上下文中 - 也会启动它们)来阻止“审核”任务阻止“汽车”任务:
var vetTask = db.GetVetAsync(id);
var carTask = db.GetCarsAsync();
var vet = await vetTask;
var validDogTypeIds = vet.DogTypes.Select(d => d.Id).ToList();
var validCatTypeIds = vet.CatTypes.Select(d => d.Id).ToList();
var dogs = db.GetDogsAsync(validDogTypeIds);
var cats = db.GetCatsAsync(validCatTypeIds);
await Task.WhenAll(carTask , dogs , cats);
car
和vetTask
现在同时运行,但在vetTask
和dogs
启动之前等待cats
。