C# 异步控制器在并行查询多个数据表时不向视图返回任何内容

C# 异步控制器在并行查询多个数据表时不向视图返回任何内容,c#,entity-framework,asp.net-mvc-5,async-await,C#,Entity Framework,Asp.net Mvc 5,Async Await,为什么此任务不向视图返回任何内容?如果我将其转换为同步,那么它就可以工作,或者如果我在VisualStudio中单步执行异步任务,那么它也可以工作 public async Task<ActionResult> Load() { var housing = _db.Housing.ToListAsync(); var school = _db.Schools.ToListAsync(); var projects = _db.Projects.ToListAs

为什么此任务不向视图返回任何内容?如果我将其转换为同步,那么它就可以工作,或者如果我在VisualStudio中单步执行异步任务,那么它也可以工作

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);
}
公共异步任务加载()
{
变量外壳=_db.housing.ToListAsync();
var school=_db.Schools.toListSync();
var projects=_db.projects.toListSync();
等待任务。WhenAll(住房、学校、项目);
var vm=新的ItemViewModel
{
住房总数=等待住房,
学校总数=等待学校,
ProjectTotals=等待项目
};
返回部分视图(vm);
}

实体框架无法使用单个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);
}
公共异步任务加载()
{
var外壳=等待_db.housing.toListSync();
var school=wait_db.Schools.ToListAsync();
var projects=await_db.projects.toListSync();
var vm=新的ItemViewModel
{
住房总数=住房,
学校总数=学校,
项目总数=项目
};
返回部分视图(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);
    }
}
private静态YourContext GetContext()
{
返回新的YourContext();//根据需要进行更改。
}
公共异步任务加载()
{
使用(var db1=GetContext())
使用(var db2=GetContext())
使用(var db3=GetContext())
{
var housing=db1.housing.ToListAsync();
var school=db2.Schools.ToListAsync();
var projects=db3.projects.ToListAsync();
等待任务。WhenAll(住房、学校、项目);
var vm=新的ItemViewModel
{
住房总数=等待住房,
学校总数=等待学校,
ProjectTotals=等待项目
};
返回部分视图(vm);
}
}

注意:使用单独的上下文方法,您正在处理它们,因此如果您有延迟加载的导航属性,则使用这些导航属性将不再有效。我建议使用第一种方法,即使用单个上下文并等待每个列表,以便在以后使用延迟加载的导航属性请求时保持
DbContext
处于活动状态。

什么是“不向视图返回任何内容”指代?视图呈现为空。浏览器中没有错误。@Scott,是的,解决了问题。等待_db.ToListAsync()修复了此问题。如果有人想知道,