多个异步操作需要另一个异步结果
本文关键字:另一个 异步 结果 异步操作 | 更新日期: 2023-09-27 18:03:00
通常我会这样写:
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);
因为这些操作需要操作完成,所以所有的数据库操作都被暂停,而不仅仅是那些需要结果的操作。
(这是一个例子,请忽略简单关系可以解决这个问题的事实)
在等待"vet"任务之前,您可以通过实例化两个任务(在async
上下文中,也会启动它们)来阻止"vet"任务阻塞"car"任务:
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
启动之前等待。