Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要另一个异步结果的多异步操作_C#_Entity Framework_Async Await - Fatal编程技术网

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

C# 需要另一个异步结果的多异步操作,c#,entity-framework,async-await,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

所以通常我会这样做:

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完成,所以所有数据库操作都处于暂停状态,而不仅仅是那些需要结果的操作

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

您可以在等待两个任务之前,通过实例化两个任务(在
异步
上下文中,这两个任务也将启动它们),阻止“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
现在同时运行,但在启动
dogs
cats
之前,等待
vetTask

单个EF上下文一次只能支持一个查询。你愿意拥有多种背景/联系吗?@StephenCleary这是一个灰色地带。它一次只能执行一个查询,但使用with EF允许一个连接同时伪加载多个对象。我想我不清楚你在问什么,但你是在寻找
ContinueWith
?@ErikPhilips:有趣!如果你确信它会起作用,安特普的答案对我来说很好。@StephenCleary是的,他的答案看起来不错,只需要他把它删除就可以了!:)