gpt4 book ai didi

c# - IServiceProvider 垃圾收集/处理

转载 作者:行者123 更新时间:2023-12-02 08:33:48 25 4
gpt4 key购买 nike

我试图调试应用程序中的内存泄漏(请参阅相关的 question ),并且遇到了错误的行为。

在此代码中(当然是简化的代码片段):

    while (true)
{
using (var context = _serviceProvider.GetRequiredService<IDataContext>())
{
Console.WriteLine("Hello");
}
}

内存消耗快速增长。

如果我注释掉服务生成,内存消耗是稳定的。

    while (true)
{
// using (var context = _serviceProvider.GetRequiredService<IDataContext>())
// {
Console.WriteLine("Hello");
// }
}

服务被注册为 transient

我的理解是 using 语句负责处置服务。 var contextwhile 的范围内创建,并应在新迭代开始时销毁。

我的第一个想法是,GC 的工作频率不够高,但是当消耗的内存量增加时,频率不会增加吗?

为什么我错了?

最佳答案

经过几天的努力,我终于得出了答案。简而言之,问题在于 Microsoft DI 容器不处理 transient 服务,它保留对它们的引用。

这是github上对应的issue

开发人员不打算修复它,因为修复的成本(复杂性和黑客性)超过了 yield 。

建议的解决方法是使用范围服务,而不是临时服务。

这是一个示例代码,请参阅 issue 中的更多内容。

using (var scope = serviceProvider.CreateScope())
using (var context = scope.ServiceProvider.GetRequiredService<IDataContext>())
{ ... }

关于c# - IServiceProvider 垃圾收集/处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43244316/

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