与 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。)

ASP.NET MVC5+EF6搭建三层实例

我们如何使用 EF 在 ASP.Net MVC 应用程序中创建 3 层架构?

ASP.NET MVC 3 EF 代码优先 - 掌握详细信息 CRUD

ASP.NET MVC Core/6:EF 6 脚手架错误