查询并行多个数据表时,异步控制器不返回任何视图 [英] Async Controller not returning anything to the view when querying multiple datatable in parallel

查看:95
本文介绍了查询并行多个数据表时,异步控制器不返回任何视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么这个任务不返回任何东西的看法?如果我将其转换为同步,然后它工作,或者如果我通过Visual Studio中的异步任务步骤,它的工作原理也。

 公共异步任务<&的ActionResult GT;加载()
{
    变种壳体= _db.Housing.ToListAsync();
    VAR学校= _db.Schools.ToListAsync();
    变种项目= _db.Projects.ToListAsync();    等待Task.WhenAll(住房,学校,项目);    VAR VM =新ItemViewModel
    {
        HousingTotals =等待住房,
        SchoolTotals =等待学校,
        ProjectTotals =等待项目
    };    返回PartialView(VM);
}


解决方案

使用单一的DbContext实体框架不能处理多个并发请求。你需要等待每个列表你移动到下一个或使用3个​​独立的DbContexts之前。

下面是如何做到这一点只是在等待每个请求单独。

 公共异步任务<&的ActionResult GT;加载()
{
    VAR住房=等待_db.Housing.ToListAsync();
    VAR学校=等待_db.Schools.ToListAsync();
    VAR项目=等待_db.Projects.ToListAsync();
    VAR VM =新ItemViewModel
    {
        HousingTotals =住房,
        SchoolTotals =学校,
        ProjectTotals =项目
    };    返回PartialView(VM);
}

使用独立的上下文。

 私有静态YourContext的getContext()
{
    根据需要//改变;返回新YourContext()。
}
公共异步任务<&的ActionResult GT;加载()
{
    使用(VAR DB1 =的getContext())
    使用(VAR DB2 =的getContext())
    使用(VAR DB3 =的getContext())
    {
        变种壳体= db1.Housing.ToListAsync();
        VAR学校= db2.Schools.ToListAsync();
        变种项目= db3.Projects.ToListAsync();        等待Task.WhenAll(住房,学校,项目);        VAR VM =新ItemViewModel
        {
            HousingTotals =等待住房,
            SchoolTotals =等待学校,
            ProjectTotals =等待项目
        };        返回PartialView(VM);
    }
}

请注意使用你正在处理他们的,所以如果你有懒加载你用那么这些导航属性将nolonger工作导航属性的单独的上下文方法。我会建议使用采用单一背景下,等待每个列表的第一个方法让你保持的DbContext 使用延迟加载导航属性活着将来的请求。

Why is this Task not returning anything to the view? If I convert it to synchronous then it works, or if I step through the async task in visual studio, it works also.

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 can not handle multiple concurrent requests using a single DbContext. You need to await each list before you move on to the next one or use 3 separate DbContexts.

Here is how to do it just awaiting each request individually.

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);
}

With separate contexts.

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);
    }
}

Note using the separate context method you are disposing of them so if you have navigation properties that are lazy loaded you use then those navigation properties will nolonger work. I would recommend using the first method of using a single context and awaiting each list so you keep the DbContext alive for future requests using the lazy loaded navigation properties.

这篇关于查询并行多个数据表时,异步控制器不返回任何视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆