Posible pérdida de memoria al crear mapas de bits

Cada tic del temporizador me gustaría verificar los datos recibidos: "000000000" y si alguno de estos bits se establece en 1 luego cambie el cuadro de imagen. Esta parte del código funciona, pero creo que tengo un problema de pérdida de memoria (la memoria utilizada por el programa está aumentando drásticamente). ¿Cómo resolver este problema?

 private void RefreshingTimerTick(object sender, EventArgs e)
 {
    for (int i = 1; i < 9; i++)
    {
       if (ReceivedDataTextBox.Text[i - 1].ToString() == "1")
          ((PictureBox)this.tabPage1.Controls["pictureBox_DO" + i.ToString()]).Image = new Bitmap(@"Logos\\green.png");
       else ((PictureBox)this.tabPage1.Controls["pictureBox_DO" + i.ToString()]).Image = new Bitmap(@"Logos\\red.png");
    }
 }

preguntado el 12 de junio de 12 a las 16:06

No es posible que el ciclo que proporcionó sea un ciclo infinito. -

2 Respuestas

Debe deshacerse de la imagen anterior (this.tabPage1.Controls["pictureBox_DO" + i.ToString()]).Image) antes de asignarlo a uno nuevo

private Bitmap _greenBitmap = new Bitmap(@"Logos\green.png"); 
private Bitmap _redBitmap = new Bitmap(@"Logos\red.png");

private void RefreshingTimerTick(object sender, EventArgs e)
{
   for (int i = 1; i < 9; i++)
   {
       PictureBox p = 
          (PictureBox)this.tabPage1.Controls["pictureBox_DO" + i.ToString()];
       if(p != null && p.Image != null)
       {  
          p.Image.Dispose();
       }

       bool is_one = (ReceivedDataTextBox.Text[i - 1].ToString() == "1");
       if(p != null)
       {
          p.Image = (is_one) ? _greenBitmap : _redBitmap;
       }
    }
 }

Respondido el 12 de junio de 12 a las 17:06

No crees siempre una imagen nueva. Intente crear previamente su imagen y solo configúrela en el control.

private Bitmap greenBitmap = new Bitmap(@"Logos\\green.png"); 
private Bitmap redBitmap = new Bitmap(@"Logos\\red.png")

private void RefreshingTimerTick(object sender, EventArgs e) 
        { 

            for (int i = 1; i < 9; i++) 
            { 
                if (ReceivedDataTextBox.Text[i - 1].ToString() == "1") 
                    ((PictureBox)this.tabPage1.Controls["pictureBox_DO" + i.ToString()]).Image = greenBitmap; 
                else ((PictureBox)this.tabPage1.Controls["pictureBox_DO" + i.ToString()]).Image = redBitmap; 
            } 
        }

Respondido el 12 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.