public class Worker
{
private Boolean Running = false;
public Boolean Work = true;
private Process[] Processes;
public event EventHandler<WorkerEventArgs> WorkerEvent;
public virtual void OnWorkerEvent(String _Event)
{
if (WorkerEvent != null) WorkerEvent(this, new WorkerEventArgs(_Event));
}
public void Start()
{
while (Work)
{
Processes = Process.GetProcessesByName("iw4mp.dat");
if (Processes.Count() >= 1)
{
if (!Running)
{
OnWorkerEvent("Run");
}
Running = true;
Thread.Sleep(2500);
}
else
{
if (Running)
{
OnWorkerEvent("Exit");
}
Running = false;
Thread.Sleep(2500);
}
foreach (var A in Processes)
{
A.Dispose();
}
}
}
}
当我使用Start()函数调用ThreadStart时,此类每2.5秒泄漏一次内存(是的,我使用任务管理器监视内存使用情况)。关于为什么会发生这种情况的任何想法......?
基本上,Start()方法应该只是轮询iw4mp.dat是否正在运行,即使它正常工作......我不知道为什么它会为每个循环分配内存......
答案 0 :(得分:2)
可能是因为你保留了整个阵列。您在循环结束时将每个Process
对象放置在数组中,但是数组本身及其所有已处置(但不是垃圾收集)的元素仍保留在内存中。垃圾收集器可以在任意时间生效,因此如果您的系统没有内存不足,那么可能只是因为GC尚未决定收集。
如果您真的想强制收集,请将其放在循环的末尾:
Processes = null;
GC.Collect();
答案 1 :(得分:0)
在C#中,即使调用Dispose
,也不会立即释放内存。垃圾收集器稍后将其释放。垃圾收集器定期在后台自动运行。如果你可以看到它在很长一段时间内(10分钟内)继续使用越来越多的内存,你就可以开始担心资源泄漏了。
答案 2 :(得分:0)
.Net应用程序可以“免费”声明所需的内存,并仅在需要时释放它。 '泄漏'通常被称为无法释放的已分配内存。处理好的物品可以在以后需要时释放。
答案 3 :(得分:0)
new WorkerEventArgs(_Event)
:你在哪里处理它?</ p>
public virtual void OnWorkerEvent(String _Event) { if (WorkerEvent != null) WorkerEvent(this, new WorkerEventArgs(_Event) ); }