2012-06-12 38 views
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"); 
    } 
} 
+2

您提供的循環不可能是無限循環。 –

回答

8

你需要將其分配到一個新的

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; 
     } 
    } 
} 
1

不要總是創建一個新的圖像之前處理舊圖像(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++) 
      { 
       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; 
      } 
     }