为什么这个线程会泄漏内存

本文关键字:泄漏 内存 线程 为什么 | 更新日期: 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((;}