如何使实体框架异步执行

Ade*_*rov 3 c# asp.net-mvc asynchronous entity-framework

我在ASP.Net MVC 5应用程序中遇到异步控制器问题.我正在使用Entity Framework 6 Code First方法.

我有一个方法

public async Task<ActionResult> Index()
{
    using(var context = new MyDbContext())
    {
        var eventsTask = context.Events
            .Where(e => e.Enable)
            .ToListAsync();

        var countTask = context.Users
            .CountAsync();

        await Task.WhenAll(eventsTask, countTask);
        return View(new ViewModel()
        {
            Events = eventsTask.Result, 
            Count = countTask.Result
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我这里有两个异步方法.我通过MiniProfiler分别测量了它们.它们需要大约85毫秒.

但是在我的方法中,我使用Task.WhenAll()运行它们.我相信它以异步方式执行Db查询,并且两者都需要大约85-90毫秒.但它需要~170-180.所以我有异步方法同步运行(彼此跟随).

我认为这是因为背景.当我删除上下文查询并使用HttpClient调用许多api方法时,我有一个测试.它需要时间等于更长的时间(3 api调用,每个~500 ms.完全方法需要~600 ms).我相信可以异步执行EF方法.

有谁知道解决方案

ken*_*n2k 7

这甚至不应该实际工作,而是抛出异常.我猜第一个查询在第二个查询开始之前完成.

EF6不支持在同一上下文中进行多个异步操作.

无论是await每个查询(所以他们不会同时运行),或使用不同的上下文为每个查询.