如何使实体框架异步执行

本文关键字:异步 执行 框架 实体 何使 | 更新日期: 2023-09-27 18:12:36

我在ASP异步控制器的问题。Net MVC 5应用程序。我使用实体框架6代码优先的方法。

我有一个方法

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
        });
    }
}

这里有两个异步方法。我通过MiniProfiler分别测量了它们中的每一个。他们需要约85毫秒

但是在我的方法中,我使用Task.WhenAll()来运行它们。我相信它异步执行Db查询,应该花费大约85-90毫秒。但需要170-180度。所以我让异步方法同步运行(彼此跟随)。

我认为这是因为上下文。我有一个测试,当我删除上下文查询,并使用HttpClient调用许多api方法。它需要的时间等于它们中的更长(3个api调用,每个调用约500 ms)。整个方法耗时约600毫秒)。我相信异步执行EF方法是可能的。

有人知道解决方法吗

如何使实体框架异步执行

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

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

要么await每个查询(因此它们不会并发运行),要么为每个查询使用不同的上下文

我找到问题了。

原因是miniprofile . ef6。1)测量我的sql问题,我使用MiniProfiler.EF6。这个框架避免了并发sql查询,即使我使用不同的EF DBContext。

2)禁用MiniProfile。EF6并运行我的应用程序。关于ken2k提到的那个,我有一个例外。为了避免这种例外,我遵循以下答案EF6不支持在同一上下文中进行多个异步操作。

3)我测量Dapper和并发SQL查询。在我的测试中,我对异步查询使用了单个SQLConnection。我已经得到了结果:

a)如果我为Dapper使用SqlConnection,则执行查询
异步(并行)

b)如果我使用ProfiledDbConnection from
MiniProfiler然后Dapper执行查询遵循彼此(不是
)并行)