gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:54 27 4
gpt4 key购买 nike

我一直在编写一个自上而下异步的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com