IAsyncEnumerable的尽早使用将永远 - c#

我有一个查询,我使用带有PostgreSQL的EF Core 3.1针对我的数据库运行,该查询有时会根据请求的参数返回较大的结果集。我正在使用Async Enumerable传输结果,有时可能需要一分钟才能完成:

try
{
    IAsyncEnumerable<Entity> ae = ctxt.Entity.Where(e => e.Value > 5).AsAsyncEnumerable();

    await foreach(Entity e in ae.ConfigureAwait(false))
    {
        //Do some work on each one here that could potentially throw an exception
    }
}
catch(Exception ex)
{
    //This code can take over a minute after the exception is thrown to begin executing
}

然后,我摆脱了await foreach循环以更好地了解发生了什么:

IAsyncEnumerable<Entity> ae = ctxt.Entity.Where(e => e.Value > 5).AsAsyncEnumerable();
var enumerator = ae.GetAsyncEnumerator();
await enumerator.MoveNextAsync();
await enumerator.DisposeAsync();
Console.WriteLline("Done Disposing");

并发现DisposeAsync调用是花费时间的地方。我回到await foreach并能够确认在循环内使用break表现出相同的行为。

接下来,我尝试创建一个非ef IAsyncEnumerable来查看此行为是否与实体框架无关。

private async IAsyncEnumerable<int> IntEnumerator()
{
    await Task.Delay(0).ConfigureAwait(false);

    for(int i = 0; i < int.MaxValue; i++)
    {
      yield return i;
    }
}

使用此代码,处置是即时的。

IAsyncEnumerable<int> ae = IntEnumerator();
var enumerator = ae.GetAsyncEnumerator();
await enumerator.MoveNextAsync();
await enumerator.DisposeAsync();
Console.WriteLline("Done Disposing");

这使我相信该问题是特定于EF内核的,但是我不确定这是否是其实现中的错误,或者我做错了什么。有没有其他人看到这样的东西并找到了解决方案?

我想在EF github页面上打开问题之前先检查一下。

参考方案

看起来这实际上是postgresql的问题。 See the issue I opened on the Npgsql github page。据维护者说,它是无法解决的。

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

使用Entity Framework Core(2.1)调用标量函数的最佳实践 - c#

我经常需要从Web应用程序(ASP.NET Core / EF Core)中调用在SQL Server上定义的标量函数。由于这些函数只是简单的辅助函数,因此我也使用了许多辅助函数,因此我使用了通用模式来调用这些标量函数-借助EF Core 2.1可用的新查询类型。由于我是EF Core的新手,所以我的问题是这种模式是否会引起问题,并且/或者是否存在调用标量函…

从Axios请求以ASP.NET Core API返回下载文件 - c#

大家好我正在尝试从Axios Request从ASP.NET Core Web API下载文件。这是我的示例API方法。 (基于此stackoverflow question的代码)[HttpPost("download")] public async Task<IActionResult> DownloadFile(){ .…

从.NET Core 2.1降级到.NET 4.7.1时,如何使用IApplicationBuilder和IServiceCollection? - c#

我不得不将我的项目从.NET Core 2.1更改为.NET 4.7.1,并且修复了几乎所有错误,但以下错误仍然困扰着我 “ IApplicationBuilder”不包含“ UseHsts”的定义,也找不到找不到接受类型为“ IApplicationBuilder”的第一个参数的扩展方法“ UseHsts”(是否缺少using指令或程序集引用?) “ IA…