gpt4 book ai didi

.net - Funq和处理子容器

转载 作者:行者123 更新时间:2023-12-01 02:27:03 24 4
gpt4 key购买 nike

我们在我们的 windows 服务中使用 Funq 来执行一些计划任务,对于每一轮我们都创建一个子容器而不是创建我们所有的对象,最后处理子容器,我们发现由这个子容器创建的元素不是 GC 作为根容器具有子容器的集合,这些子容器在调用子容器的处理后留在那里。此代码重现了我们的问题,并将消耗(并保留)800MB 的内存。

对我们来说这很令人惊讶,以这种方式使用 funq 是错误的模式,在这种情况下我们应该如何使用它?或者这只是一个错误?

谢谢

public class Dummy
{
public string Content { get; set; }
public void Generate(int size)
{
this.Content = new string('X', size);
}
}

class Program
{
static void Main(string[] args)
{
var container = new Container();
container.RegisterAutoWired<Dummy>().ReusedWithin(ReuseScope.Container);
int size = 20000;
for (int i = 0; i < size; i++)
{
using (var c = container.CreateChildContainer())
{
var d= c.Resolve<Dummy>();
d.Generate(size);
}
PrintInfo(i);
}

Console.ReadLine();
}

private static void PrintInfo(int i)
{
if (i%1000 == 0)
{
int divide = 1024*1024;
GC.Collect();
var p = System.Diagnostics.Process.GetCurrentProcess();
Console.WriteLine(p.WorkingSet64/divide + "MB");
Console.WriteLine(p.PrivateMemorySize64/divide + "MB");
}
}
}

最佳答案

Funq sources 中查看 Container.cs (上次更新于 2011 年),
我可以说它泄漏了子容器。

CreateChildContainer 方法创建新容器,并将其与父容器连接
并添加对 childContainers 堆栈的创建引用。

使用 childContainers 堆栈的地方只有两个:

  • childContainers.Push(child);在 Container.CreateChildContainer()(第 73 行)中
  • childContainers.Pop().Dispose();在 Container.Dispose()(第 88 行)中

  • 因此,如果您创建子容器,然后处理它(但不是其父容器) -
    对已处理子项的引用保留在父项中,因为没有清理代码
    这将从父级的堆栈中删除已处理的引用。

    可能您可以通过创建代理子容器(仅一次)来解决此问题,
    然后从中派生出所有真正的子容器。由于 Dispose 方法确实
    不将对象转移到不可用状态 - 您可以清理所有子项
    通过为代理 child 一遍又一遍地调用 Dispose :
        var container = new Container();
    container.RegisterAutoWired<Dummy>().ReusedWithin(ReuseScope.Container);
    int size = 20000;
    var proxy = container.CreateChildContainer()
    for (int i = 0; i < size; i++)
    {
    using (proxy)
    using (var c = proxy.CreateChildContainer())
    {
    var d= c.Resolve<Dummy>();
    d.Generate(size);
    }
    PrintInfo(i);
    }

    关于.net - Funq和处理子容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15512035/

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