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

时间:2011-06-25 21:00:42

标签: c# multithreading memory-leaks

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是否正在运行,即使它正常工作......我不知道为什么它会为每个循环分配内存......

4 个答案:

答案 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) );
}