c# - 在使用 EntityFramework 6.1.1 任务扩展 'ToArrayAsync' 时,等待永远不会返回

标签 c# sql entity-framework asynchronous asp.net-web-api

我一直在编写一个自上而下异步的 WebApi 服务,并且发现我的一个 Entity Framework 查询有一个奇怪的行为。我们使用的是 Entity Framework 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 Controller 方法中调用,如果我们删除 nested 方法调用的异步部分,此查询将执行并正常返回。

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

我已经尝试从上述查询中删除“选择”具体化,但它仍然失败,所以不是那样。有没有人见过这种行为?它似乎与 async 关键字非常相关,但我没有得到任何异常(exception)或线索。非常欢迎任何建议! SQL Server 2014、VS2013 更新 3、高端 PC (i7)。看起来真的很像一个死锁,但我看不出它会被什么死锁!

如有任何帮助,我们将不胜感激。

最佳答案

您可能已经在 DbContext 使用范围之外使用了 await 运算符。

我有以下方法:

    public Task<Entity[]> GetAsync()
    {
        using (var context = new DataContext())
        {
            return context.Entities.Where(e => e.Status == Status.Pending).ToArrayAsync();
        }
    }

我是这样期待的:

await GetAsync()

并且此行永远不会返回。然后我更改了实现并将 await 运算符放在 inside using(context) scope:

    public async Task<Entity[]> GetAsync()
    {
        using (var context = new DataContext())
        {
            Entity[] es = await context.Entities.Where(e => e.Status == Status.Pending).ToArrayAsync();
            return es;
        }
    }

这为我解决了这个问题。

关于c# - 在使用 EntityFramework 6.1.1 任务扩展 'ToArrayAsync' 时,等待永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25874267/

相关文章:

c# - 使用 Mutex(??) 检查只允许 2 个事件应用程序实例

c# - 当前文件夹中的图像在新上传时不会被删除

c# - EF Core 中的多个 Includes()

c# - 如何更新用户?

mysql - 如果列返回空结果,请检查 MySQL 中的另一列

c# - 批量更新数据库的最快方法?

c# - Entity Framework 向表中添加记录

c# - .NET 无法使用 ODBC 5.3 连接到 MySQL?

c# - WP7 (windows phone 7) HttpWebRequest 丢失 POST 数据

c# - 通过将 UI 分解为 'regions' 来提高 WPF 性能 - 这可能吗?