gpt4 book ai didi

c# - ServiceProvider 不为 transient EF 上下文释放内存

转载 作者:太空狗 更新时间:2023-10-29 20:33:03 33 4
gpt4 key购买 nike

我在 .NET 4.6.2 上有一个 Windows 服务,我在其中使用 .NET ServiceProvider(System.IServiceProvider 接口(interface))将 EF6 DbContext 注册为 Transient。该服务开始使用大约 30mb 的内存,一天后达到 1Gb。

在进程上运行分析器告诉我有数十万个 DbContext 对象等待释放,即使我在每次使用后处理上下文也是如此。

这是代码示例:

// registration
var services = new ServiceCollection();
services.AddTransient(sp => new ServiceDbContext(connectionString));
var serviceProvider = services.BuildServiceProvider();

// use
using (var ctx = serviceProvider.GetRequiredService<ServiceDbContext>()) { ... }

将 AsNoTracking 添加到查询中可以减少内存使用量,但上下文仍会永远保留在内存中。似乎没有任何 ServiceProvider 的发布方法。

这是一个示例对象树,运行该服务几分钟,然后让它再闲置几分钟。 4838 是我实例化上下文的次数。请注意,在拍摄此快照之前,我在闲置几分钟后强制执行 GC:

enter image description here

除了处置上下文之外,我还应该做些什么来释放上下文吗?或者这是内置服务提供商的一些限制?

最佳答案

好吧,这看起来像是 ServiceProvider 当前实现中的一个错误,出于某种原因在根上下文中跟踪一次性对象。

https://github.com/aspnet/DependencyInjection/issues/456

关于c# - ServiceProvider 不为 transient EF 上下文释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113612/

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