我们在我们的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");
}
}
}