C# 当使用EntityFramework 6.1.1任务扩展“ToArrayAsync”时,等待永远不会返回

C# 当使用EntityFramework 6.1.1任务扩展“ToArrayAsync”时,等待永远不会返回,c#,sql,entity-framework,asynchronous,asp.net-web-api,C#,Sql,Entity Framework,Asynchronous,Asp.net Web Api,我一直在编写一个自上而下异步的WebApi服务,并在我的一个实体框架查询中发现了一个奇怪的行为。我们使用的是实体框架6.1.1,查询本身相对简单: var companyRoles = await model.Memberships.Include(m => m.Role) .Where(m => m.UserProfileId == guid).Select(cr => new { Membership = cr, cr.Role }).ToArray

我一直在编写一个自上而下异步的WebApi服务,并在我的一个实体框架查询中发现了一个奇怪的行为。我们使用的是实体框架6.1.1,查询本身相对简单:

var companyRoles = await model.Memberships.Include(m => m.Role)
            .Where(m => m.UserProfileId == guid).Select(cr => new { Membership = cr, cr.Role }).ToArrayAsync(); 

... rest of the method excluded for brevity
自然地,这个调用被封装在一个异步任务中,返回类型为可枚举。在执行查询时,我们可以看到正在使用SQL Profiler进行的调用,当单独捕获和执行时,将返回预期结果,但是代码中的ToArrayAsync具体化永远不会返回。我们可以让它挂起几分钟,没有明显的错误或信息

Contxt:这个方法本身是在一个异步WebApi控制器方法中调用的,如果我们删除嵌套方法调用的异步部分,这个查询就会执行并返回良好的结果

在api的上述部分中,没有其他数据库处理,这是系统中运行的唯一线程。这在我的本地开发机器上,并且在行为上也是一致的

我已经尝试从上面的查询中删除“Select”具体化,但仍然失败,所以不是这样。以前有人见过这种行为吗?它似乎与async关键字非常相关,但我没有发现异常或线索。欢迎任何建议!SQL Server 2014,VS2013更新3,高端PC i7。它的外观看起来真的像一个僵局,但我看不出它会与什么僵持在一起


任何帮助都将不胜感激。

您可能在DbContext使用范围之外使用了wait操作符

我有以下方法:

    public Task<Entity[]> GetAsync()
    {
        using (var context = new DataContext())
        {
            return context.Entities.Where(e => e.Status == Status.Pending).ToArrayAsync();
        }
    }
这条线永远不会回来。然后我更改了实现,并使用上下文范围将wait操作符放入其中:


这为我解决了这个问题。

因为这篇文章没有解决方案,所以我想写下,我也遇到了同样的问题,并使用ToListSync解决了这个问题


我在嵌套查询中也遇到了这个问题,必须将其作为两个查询。

从顶级应用程序入口点到这个EF方法,整个异步调用堆栈是什么样子的?您可能正在某个地方死锁同步上下文;它应该是4.5.httpRuntime.targetFramework,肯定设置为4.5,但绝对值得检查,谢谢。这是对另一个问题的一个很好的回答,但可能不是对这个问题的回答:OP确实正确地使用了Wait。问题显示了代码的样子:var companyRoles=await[…];。
await GetAsync()
    public async Task<Entity[]> GetAsync()
    {
        using (var context = new DataContext())
        {
            Entity[] es = await context.Entities.Where(e => e.Status == Status.Pending).ToArrayAsync();
            return es;
        }
    }