Вопрос по c# – Непрерывное создание растровых изображений приводит к утечке памяти

7

У меня есть поток, который непрерывно генерирует растровые изображения и делает снимок экрана с окном другой программы. Теперь у меня есть форма PictureBox в моей форме, и она постоянно обновляется сгенерированными растровыми изображениями. Вот код, который у меня есть в теме:

        Bitmap bitmap = null;

        while (true)
        {
            if (listBoxIndex != -1)
            {
                Rectangle rect = windowRects[listBoxIndex];
                bitmap = new Bitmap(rect.Width, rect.Height);
                Graphics g = Graphics.FromImage(bitmap);
                IntPtr hdc = g.GetHdc();
                PrintWindow(windows[listBoxIndex], hdc, 0);
                pictureBox1.Image = bitmap;
                g.ReleaseHdc(hdc);
            }
        }

Как видите, это приводит к утечке памяти из-за постоянного вызова нового растрового изображения (rect.Width, rect.Height). Я пытался добавить "bitmap.Dispose ()" до конца цикла while, но это приводит к тому, что изображение pictureBox также располагается, что делает гигантский красный X вместо фактического изображения. Можно ли как-нибудь избавиться от «растрового изображения»? без утилизации изображения pictureBox?

Ваш Ответ

2   ответа
1

В ответном примере есть утечка с графикой послеg.ReleaseHdc(..);

Не забудьте добавить графическую переменную

как например:

g.Dispose();
Error: User Rate Limit Exceeded
10

Вы также "протекаете" Графический объект. Попробуй это:

    while (true)
    {
        if (listBoxIndex != -1)
        {
            Rectangle rect = windowRects[listBoxIndex];
            Bitmap bitmap = new Bitmap(rect.Width, rect.Height);
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                IntPtr hdc = g.GetHdc();
                try
                {
                    PrintWindow(windows[listBoxIndex], hdc, 0);
                }
                finally
                {
                    g.ReleaseHdc(hdc);
                }
            }
            if (pictureBox1.Image != null)
            {
                pictureBox1.Image.Dispose();
            }
            pictureBox1.Image = bitmap;
        }
    }
Error: User Rate Limit ExceededImage.Dispose()Error: User Rate Limit Exceeded
usingError: User Rate Limit ExceededPictureBoxError: User Rate Limit ExceededPictureBox.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user1440308
Error: User Rate Limit ExceededBitmap.Dispose()Error: User Rate Limit Exceededusing Graphics g = Graphics.FromImage(Bitmap)Error: User Rate Limit ExceededGraphics gError: User Rate Limit Exceededg = Graphics.FromImage(Bitmap); g.Dispose()Error: User Rate Limit Exceeded

Похожие вопросы