C# 如何使实体框架异步执行
我对ASP.NETMVC5应用程序中的异步控制器有问题。 我使用实体框架6代码优先的方法 我有办法C# 如何使实体框架异步执行,c#,asp.net-mvc,entity-framework,asynchronous,C#,Asp.net Mvc,Entity Framework,Asynchronous,我对ASP.NETMVC5应用程序中的异步控制器有问题。 我使用实体框架6代码优先的方法 我有办法 public async Task<ActionResult> Index() { using(var context = new MyDbContext()) { var eventsTask = context.Events .Where(e => e.Enable) .ToListAsync()
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
});
}
}
公共异步任务索引()
{
使用(var context=new MyDbContext())
{
var eventsTask=context.Events
。其中(e=>e.Enable)
.ToListAsync();
var countTask=context.Users
.CountAsync();
等待任务。WhenAll(eventsTask,countTask);
返回视图(新视图模型()
{
Events=eventsTask.Result,
Count=countTask.Result
});
}
}
这里有两个异步方法。我通过MiniProfiler分别测量了它们。它们需要约85毫秒
但在我的方法中,我使用Task.WhenAll()运行它们。我相信它是异步执行Db查询的,这两种查询都需要大约85-90毫秒。但是大约需要170-180分钟。所以我让异步方法同步运行(相互跟踪)
我认为这是因为上下文。我有一个测试,当我删除上下文查询并使用HttpClient调用许多api方法时。这需要的时间相当于更长的时间(3个api调用,每个调用约500毫秒。整个方法需要约600毫秒)。我相信异步执行EF方法是可能的
有人知道解决方案吗?这实际上不应该工作,而是抛出一个异常。我猜第一个查询在第二个查询开始之前就完成了 要么等待每个查询(这样它们就不会同时运行),要么为每个查询使用不同的上下文。我发现了问题 原因是一个MiniProfiler.EF6。 1) 为了度量我的sql问题,我使用MiniProfiler.EF6。即使我使用不同的EF DBContext,这个框架也避免了并发sql查询 2) 我禁用MiniProfile.EF6并运行我的应用程序。我有一个关于ken2k提到的例外。为了避免这个例外,我遵循这个答案 3) 我度量简洁和并发的SQL查询。我在测试中使用了一个SQLConnection进行异步查询。我得到了以下结果: a) 如果我对Dapper使用SqlConnection,则执行查询
异步(并行) b) 如果我从
然后,MiniProfiler以简洁的方式执行查询(而不是
并行)EF是否支持并行操作?可能它只是将它们序列化。尝试为每个任务使用不同的上下文,并发布时间安排。可能重复我读过的这篇文章。我尝试了不同的上下文,但得到了相同的结果。它运行良好,没有任何错误。但我也尝试过使用不同的上下文,我得到了相同的结果。@GFoley83不确定为什么要将此链接,但描述的答案不起作用