多重异步操作需要另一个异步结果

时间:2015-07-16 17:29:47

标签: c# entity-framework async-await

通常情况下我会这样做:

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);

由于操作需要兽医完成,所有数据库操作都处于暂停状态,而不仅仅是那些需要结果的操作。

(这是一个例子,请忽略简单关系可以解决这个问题的事实。)

1 个答案:

答案 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);

carvetTask现在同时运行,但在vetTaskdogs启动之前等待cats