使用 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()));