gpt4 book ai didi

c# - 并行查询多个数据表时,异步 Controller 不会向 View 返回任何内容

转载 作者:行者123 更新时间:2023-12-03 03:16:31 24 4
gpt4 key购买 nike

为什么此任务没有向 View 返回任何内容?如果我将其转换为同步,那么它就可以工作,或者如果我在 Visual Studio 中单步执行异步任务,它也可以工作。

public async Task<ActionResult> Load()
{
var housing = _db.Housing.ToListAsync();
var school = _db.Schools.ToListAsync();
var projects = _db.Projects.ToListAsync();

await Task.WhenAll(housing, school, projects);

var vm = new ItemViewModel
{
HousingTotals = await housing,
SchoolTotals = await school,
ProjectTotals = await projects
};

return PartialView(vm);
}

最佳答案

Entity Framework 无法使用单个 DbContext 处理多个并发请求。您需要等待每个列表,然后才能转到下一个列表或使用 3 个单独的 DbContext。

以下是如何单独等待每个请求。

public async Task<ActionResult> Load()
{
var housing = await _db.Housing.ToListAsync();
var school = await _db.Schools.ToListAsync();
var projects = await _db.Projects.ToListAsync();


var vm = new ItemViewModel
{
HousingTotals = housing,
SchoolTotals = school,
ProjectTotals = projects
};

return PartialView(vm);
}

具有单独的上下文。

private static YourContext GetContext()
{
return new YourContext();//Change as needed.
}


public async Task<ActionResult> Load()
{
using(var db1 = GetContext())
using(var db2 = GetContext())
using(var db3 = GetContext())
{
var housing = db1.Housing.ToListAsync();
var school = db2.Schools.ToListAsync();
var projects = db3.Projects.ToListAsync();

await Task.WhenAll(housing, school, projects);

var vm = new ItemViewModel
{
HousingTotals = await housing,
SchoolTotals = await school,
ProjectTotals = await projects
};

return PartialView(vm);
}
}

请注意,您使用单独的上下文方法来处理它们,因此如果您使用延迟加载的导航属性,那么这些导航属性将不再起作用。我建议使用第一种方法,即使用单个上下文并等待每个列表,以便使用延迟加载导航属性使 DbContext 保持事件状态以供将来的请求。

关于c# - 并行查询多个数据表时,异步 Controller 不会向 View 返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30446100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com