如何使entity framework异步执行
我在ASP.Net MVC 5应用程序中遇到异步控制器问题。 我正在使用Entity Framework 6 Code First方法。
我有一个方法
public async Task 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 ms)。 我相信可以异步执行EF方法。
有谁知道解决方案
这甚至不应该实际工作,而是抛出exception。 我猜第一个查询在第二个查询开始之前完成。
EF6不支持在同一上下文中进行多个异步操作。
await
每个查询(因此它们不会同时运行),或者为每个查询使用不同的上下文。
我发现了问题。
原因是MiniProfiler.EF6。 1)为了测量我的SQL问题,我使用MiniProfiler.EF6。 即使我使用不同的EF DBContext,这个框架也避免了并发sql查询。
2)我禁用MiniProfile.EF6并运行我的应用程序。 我有一个关于ken2k提到的例外。 为了避免这种exception,我遵循这个答案EF6不支持在同一个上下文中进行多个异步操作。
3)我测量Dapper和并发SQL查询。 我在测试中使用了单个SQLConnection进行异步查询。 我有结果:
a)如果我使用SqlConnection进行Dapper,则查询执行
异步(并行)
b)如果我使用ProfiledDbConnection
MiniProfiler然后Dapper执行查询跟随彼此(不是
平行)
上述就是C#学习教程:如何使entity framework异步执行分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031376.html