CodewithNeo Ответов: 0

Байт частной памяти растет в приложении C#


Привет,

Я создал приложение для отслеживания текущего активного окна на экране. Я использую таймер и подписываюсь на его прошедшее событие, чтобы он мог обработать мой код. Я установил интервал таймера на 2 секунды.

Когда я запускаю это приложение, я вижу увеличение значения частных байтов (отраженное в TaskManager), и оно продолжает увеличиваться.

После просмотра видео на youtube я попытался установить все возможные объекты в Null для правильного удаления, а также установить используемый оператор "Using" для восстановления памяти из собственных объектов.


class myservice
{

    public void Start()
    {
        Timer tActiveWin = new Timer();
        tActiveWin.Interval = TimeSpan.FromSeconds(2).TotalMilliseconds;
        tActiveWin.Elapsed += TActiveWin_Elapsed;
        tActiveWin.AutoReset = true;
        tActiveWin.Enabled = true;
    }

    private void TActiveWin_Elapsed(object sender, ElapsedEventArgs e)
    {
        var win = new WindowEvents().GetActiveWindow();
        Console.WriteLine(win.activewindowtitle);
    }
}

class WindowEvents
{
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

    public JsonAppEvents.Activewindow GetActiveWindow()
    {
        Task<JsonAppEvents.Activewindow> activeWindow = Task.Factory.StartNew(() =>
        {
                JsonAppEvents.Activewindow activeWin = new JsonAppEvents.Activewindow();

                IntPtr hWnd = GetForegroundWindow();

                int processID = 0;
                int threadID = GetWindowThreadProcessId(hWnd, out processID);


            using (Process p = Process.GetProcessById(processID))
            {
                StringBuilder text = new StringBuilder(256);
                if (GetWindowText(hWnd, text, 256) > 0)
                {
                    text.ToString();
                }

                activeWin.activewindowfullpath = p.MainModule.FileName;
                activeWin.activewindowtitle = p.MainWindowTitle;
                activeWin.time = p.StartTime.ToString("ddd, dd MMM yyyy HH:mm:ss");
                activeWin.activewindowdescription = p.MainModule.ModuleName;

                p.Dispose();

                hWnd = IntPtr.Zero;
                processID = 0;
                threadID = 0;
                text.Clear();
                text = null;

                return activeWin;
            }
        });


        return activeWindow.Result;

    }
}


class JsonAppEvents
{

    public class Activewindow
    {
        public string activewindowfullpath { get; set; }
        public string activewindowdescription { get; set; }
        public string time { get; set; }
        public string activewindowtitle { get; set; }
    }
}


После запуска программы я захватил частные байты следующим образом :

Время PrivateBytes
-----------------------
5300 К 8: 45 ВЕЧЕРА

5800 К 8: 46 ВЕЧЕРА

7,252 K 8: 47 ВЕЧЕРА

7,260 K 8: 49 ВЕЧЕРА

------------------------------

Я ищу какую-то помощь по этому поводу, чтобы стабилизировать частные байты от увеличения и правильно проследить, почему это происходит? что-то не так с моим кодом?

Что я уже пробовал:

- Поиск в интернете объекта утилизации
- Я попытался установить все возможные объекты в Null для правильного удаления, а также установить used.

Richard Deeming

Я хотел бы начать путем удаления Task.Factory.StartNew в GetActiveWindow метод. Вы запускаете новую задачу в фоновом потоке только для того, чтобы заблокировать текущий поток и дождаться его завершения. Вместо этого просто выполняйте работу над текущим потоком.

Вы также можете избавиться от вызова GetWindowText и связанные с этим StringBuilder, так как вы никогда не используете возвращаемое значение.

И вам не нужно явно вызывать Dispose на объекте, который завернут в using блок.

Bernhard Hiller

Диспетчер задач Windows не является хорошим инструментом для обнаружения и анализа утечек памяти. Ваше заявление может быть ложноположительным.

0 Ответов