使用 MVC 3、.NET 4.5 和 EF 6 并行获取数据
Get data in parallel with MVC 3, .NET 4.5 and EF 6
我正在使用 .NET 4.5 和 Entity Framework 6 开发 MVC 3 项目。我的目标是使用 Entity framework 并行执行多个数据请求。
我知道 MVC 3 不支持异步等待关键字,但部分支持任务。
我的问题是:
如何在控制器中与 Entity Framework 并行获取数据?对于 MVC 5,我必须在我的存储库和控制器中使用“.ToListAsync()”和 "await",但对于 MVC 3 是不可能的。
我认为最好的解决方案是:
[HttpPost]
public ActionResult Test()
{
var tasks = new List<Task>();
var myRepository = new MyRepository();
List<Object1> object1List = null;
tasks.Add(Task<List<Object1>>.Factory.StartNew(() => object1List = myRepository.GetAll1()));
List<Object2> object2List = null;
tasks.Add(Task<List<Object2>>.Factory.StartNew(() => object2List = myRepository.GetAll2()));
Task.WaitAll(tasks.ToArray());
}
public class MyRepository
{
/// <summary>
/// This query takes ~90ms
/// </summary>
public List<Object1> GetAll1()
{
using (var context = new MyContext())
{
return context.MyTable1.ToList();
}
}
/// <summary>
/// This query takes more time (~400ms)
/// </summary>
public List<Object2> GetAll2()
{
using (var context = new MyContext())
{
return context.MyTable2.Join(...).Where(...).OrderBy(...).ThenBy(...).ToList();
}
}
}
这真的是正确的解决方案吗?
谢谢!
勾选this answer here。基本上 MVC 3 不支持异步等待,但你不应该使用任务工厂。
您需要为 MVC 3 使用 Task Paraller library。
基本上,它说的是你应该去
tasks.Add(Task.Run(() => object1List = myRepository.GetAll1()));
我正在使用 .NET 4.5 和 Entity Framework 6 开发 MVC 3 项目。我的目标是使用 Entity framework 并行执行多个数据请求。
我知道 MVC 3 不支持异步等待关键字,但部分支持任务。
我的问题是:
如何在控制器中与 Entity Framework 并行获取数据?对于 MVC 5,我必须在我的存储库和控制器中使用“.ToListAsync()”和 "await",但对于 MVC 3 是不可能的。
我认为最好的解决方案是:
[HttpPost]
public ActionResult Test()
{
var tasks = new List<Task>();
var myRepository = new MyRepository();
List<Object1> object1List = null;
tasks.Add(Task<List<Object1>>.Factory.StartNew(() => object1List = myRepository.GetAll1()));
List<Object2> object2List = null;
tasks.Add(Task<List<Object2>>.Factory.StartNew(() => object2List = myRepository.GetAll2()));
Task.WaitAll(tasks.ToArray());
}
public class MyRepository
{
/// <summary>
/// This query takes ~90ms
/// </summary>
public List<Object1> GetAll1()
{
using (var context = new MyContext())
{
return context.MyTable1.ToList();
}
}
/// <summary>
/// This query takes more time (~400ms)
/// </summary>
public List<Object2> GetAll2()
{
using (var context = new MyContext())
{
return context.MyTable2.Join(...).Where(...).OrderBy(...).ThenBy(...).ToList();
}
}
}
这真的是正确的解决方案吗? 谢谢!
勾选this answer here。基本上 MVC 3 不支持异步等待,但你不应该使用任务工厂。
您需要为 MVC 3 使用 Task Paraller library。
基本上,它说的是你应该去
tasks.Add(Task.Run(() => object1List = myRepository.GetAll1()));