Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使实体框架异步执行_C#_Asp.net Mvc_Entity Framework_Asynchronous - Fatal编程技术网

C# 如何使实体框架异步执行

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()

我对ASP.NETMVC5应用程序中的异步控制器有问题。 我使用实体框架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
        });
    }
}
公共异步任务索引()
{
使用(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不确定为什么要将此链接,但描述的答案不起作用