与 MVC 3、.NET 4.5 和 EF 6 并行获取数据
Posted
技术标签:
【中文标题】与 MVC 3、.NET 4.5 和 EF 6 并行获取数据【英文标题】:Get data in parallel with MVC 3, .NET 4.5 and EF 6 【发布时间】:2020-04-10 17:13:06 【问题描述】:我正在使用 .NET 4.5 和 Entity Framework 6 开发 MVC 3 项目。我的目标是使用 Entity Framework 并行执行多个数据请求。
我知道 MVC 3 不支持异步等待关键字,但部分支持任务。
我的问题是:
如何在控制器中与实体框架并行获取数据?对于 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();
这真的是正确的解决方案吗? 谢谢!
【问题讨论】:
你也可以用 try-catch 包围 WaitAll 并准备好捕获聚合异常,否则你可能会吞下一些异常。 Async 和 Await 将有助于使应用程序更具响应性,在您的情况下,Tasks 是并行执行的好主意 是的,我必须准备好处理聚合异常。使用 async await 更容易做到这一点,但不适用于 MVC 3。感谢您的评论 Clint。 【参考方案1】:检查this answer here。基本上 MVC 3 不支持异步等待,但你不应该使用任务工厂。
对于 MVC 3,您需要使用 Task Paraller library。
基本上,它说的是你应该去
tasks.Add(Task.Run(() => object1List = myRepository.GetAll1()));
【讨论】:
完美!谢谢Athanasios以上是关于与 MVC 3、.NET 4.5 和 EF 6 并行获取数据的主要内容,如果未能解决你的问题,请参考以下文章
将 asp.net 5 MVC 6 与 Identity 和 EF 6 一起使用的示例
MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)
我们如何使用 EF 在 ASP.Net MVC 应用程序中创建 3 层架构?