-1

有人帮助我使用计时器在运行时运行了一些代码,但过了一会儿我发现它只是在使用内存而不是释放它。

我听说过一些有关 AppDomain 的信息,但我不知道在哪里使用它。

AppDomain 会帮助我解决内存泄漏问题吗?那还有什么可以帮助我的吗?

PS: GC.Collect() 没有帮助。我确定问题在于,由于我进行了一些测试,在运行问题时观察内存,如果我禁用 Scripter,它会保持相同的数量(基本上),如果我用一些代码启动计时器来执行它,请保持增加,几分钟后可能会使用 500k+ 的内存,所以是的,我确定问题出在 CSharpCodeProvider 仅使用内存。

这是我的实际代码,所以如果有人可以帮助我解决这个问题会很棒。

//It is executed in a timer of 500 ms
private void Run()
{
    foreach (Code ph in codeList)
    {
        Code p = ph;

        new Thread(delegate()
        {
            if (Monitor.TryEnter(p))
            {
                Scripter script = new Scripter();
                script.Compile(p.Code);
                Monitor.Exit(p);
            }
        }) { IsBackground = true }.Start();
    }
}

//That's my compile code
public bool Compile(string script)
{
    CSharpCodeProvider codeprovider = new CSharpCodeProvider();
    ICodeCompiler icc = codeprovider.CreateCompiler();
    CompilerParameters cp = new CompilerParameters();

    cp.ReferencedAssemblies.Add("System.dll");
    cp.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);

    cp.TreatWarningsAsErrors = false;

    cp.MainClass = "CodesRun";
    cp.CompilerOptions = "/target:library /optimize";
    cp.GenerateExecutable = false;
    cp.GenerateInMemory = false; //it was true, but same problem

    TempFileCollection tfc = new TempFileCollection(Application.StartupPath, false);
    CompilerResults cr = new CompilerResults(tfc);

    cr = icc.CompileAssemblyFromSource(cp, script);

    if (cr.Errors.Count > 0)
    {
        //Error
    }
    else
    {
        Assembly assembly = cr.CompiledAssembly;
        IScript teste = (IScript)assembly.CreateInstance("CodesRun.Script");
        teste.Run();
    }
    tfc.Delete();
    codeprovider.Dispose();

    return true;
}
4

1 回答 1

0

使用 using 指令处理完对象后,请尝试处理它们。例如:

using( Scripter script = new Scripter() ){
   script.Compile(p.Code);
   Monitor.Exit(p);
}

这可能无法修复您的泄漏,但它应该会减少您的内存占用(即您应该看到内存尽快被回收)。

就像@Andrew Barber 所说,您应该使用内存分析工具来验证是否存在泄漏。我们使用 AQTime,但它是付费的(虽然不是太贵)。此处讨论的免费选项。

于 2012-04-09T19:00:52.033 回答