在并行查询多个数据表时,Async Controller不会向视图返回任何内容

use*_*149 2 c# entity-framework async-await asp.net-mvc-5

为什么这个Task没有返回任何视图?如果我将它转换为同步然后它可以工作,或者如果我在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);
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ain 5

实体框架无法使用单个DbContext处理多个并发请求.在继续下一个列表或使用3个​​单独的DbContexts之前,您需要等待每个列表.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

具有单独的上下文.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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