为什么这个线程会泄漏内存
本文关键字:泄漏 内存 线程 为什么 | 更新日期: 2023-09-27 18:00:35
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是否正在运行,即使它有效。。。我不知道为什么它总是在每个循环中分配内存。。。
这可能是因为您保留了整个数组。在循环结束时,可以处理数组中的每个Process
对象,但数组本身及其所有已处理(但不是垃圾收集(的元素仍保留在内存中。垃圾收集器可以在任意时间发挥作用,因此如果您的系统没有内存不足,那么这可能只是因为GC尚未决定进行收集。
如果你真的想强制收集,把这个放在循环的末尾:
Processes = null;
GC.Collect();
在C#中,即使调用Dispose
,内存也不会立即释放。垃圾收集器稍后会释放它。垃圾收集器定期在后台自动运行。如果你看到它在很长一段时间(10分钟(内继续使用越来越多的内存,你可能会开始担心资源泄漏。
.Net应用程序可以"自由"地请求所需的内存,并仅在需要时释放泄漏通常被称为无法释放的已分配内存。稍后需要时可以释放已释放的对象。
new WorkerEventArgs(_Event)
:在哪里处理?
公共虚拟void OnWorkerEvent(String_Event({if(WorkerEvent!=null(WorkerEvent(this,new WorkerEventArgs(_Event((;}