查询并行多个数据表时,异步控制器不返回任何视图 [英] Async Controller not returning anything to the view when querying multiple datatable in parallel
问题描述
为什么这个任务不返回任何东西的看法?如果我将其转换为同步,然后它工作,或者如果我通过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屋!