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

本文关键字:另一个 异步 结果 异步操作 | 更新日期: 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);

carvetTask现在同时运行,但vetTaskdogscats启动之前等待。