0

タイマーのティックごとに、受信したデータを確認したいと思います。"000000000"これらのビットのいずれかが設定されている場合は、1画像ボックスを変更します。コードのこの部分は機能していますが、メモリリークの問題があると思います(プログラムで使用されるメモリが大幅に増加しています)。この問題を解決するにはどうすればよいですか?

 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");
    }
 }
4

2 に答える 2

8

this.tabPage1.Controls["pictureBox_DO" + i.ToString()]).Image新しい画像に割り当てる前に、古い画像()を破棄する必要があります

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;
       }
    }
 }
于 2012-06-12T15:54:30.280 に答える
1

常に新しい画像を作成しないでください。画像を事前に作成し、それをコントロールにのみ設定してみてください。

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; 
            } 
        }
于 2012-06-12T15:55:46.910 に答える