Почему этот поток пропускает память? - PullRequest
1 голос
/ 26 июня 2011
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();
            }
        }
    }
}

Этот класс пропускает память каждые 2,5 секунды (да, я контролировал использование памяти с помощью диспетчера задач), когда я вызываю ThreadStart с помощью функции Start ().Любые идеи о том, почему это происходит ...?

По сути, метод Start () должен просто опросить, если iw4mp.dat работает, даже если он работает ... я понятия не имею, почему он продолжает выделять памятькаждая петля ...

Ответы [ 4 ]

2 голосов
/ 26 июня 2011

Это может быть потому, что вы сохраняете весь массив.Вы размещаете каждый Process объект в массиве в конце цикла, но сам массив и все его расположенные (но не сборочные) элементы остаются в памяти.Сборщик мусора может вступать в действие в произвольные моменты времени, поэтому, если вашей системе не хватает памяти, это может быть просто потому, что сборщик мусора еще не решил собрать.

Если вы действительно хотите форсировать сбор,поместите это в конец вашего цикла:

Processes = null;
GC.Collect();
0 голосов
/ 26 июня 2011

new WorkerEventArgs(_Event): где вы его утилизируете?

public virtual void OnWorkerEvent(String _Event)
{
    if (WorkerEvent != null) WorkerEvent(this, <b><i>new WorkerEventArgs(_Event)</i></b> );
}
0 голосов
/ 26 июня 2011

.Net-приложения «бесплатны», чтобы требовать столько памяти, сколько необходимо, и освобождать ее только при необходимости.«Утечка» обычно называется выделенной памятью, которая не может быть освобождена.Утилизированные объекты могут быть освобождены позже, когда это необходимо.

0 голосов
/ 26 июня 2011

В C # память не освобождается сразу, даже когда вызывается Dispose. Позже он освобождается сборщиком мусора. Сборщик мусора регулярно запускается автоматически в фоновом режиме. Если вы видите, что он продолжает использовать все больше и больше памяти в течение длительного времени (10 минут), вы можете начать беспокоиться об утечке ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...