有人帮助我使用计时器在运行时运行了一些代码,但过了一会儿我发现它只是在使用内存而不是释放它。
我听说过一些有关 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;
}