2017-05-18 40 views
-1

我想選擇多個(在我的情況下77)圖像,並將它們轉換爲其他大小和格式。 我做了一個Ilist(字符串)listaslika,其中包含來自文件夾的圖像名稱列表。 tbSelect是一個文本框,其中包含圖像所來自的文件夾路徑,而tbSave包含將保存圖像的文件夾。 現在我想調整他們所有的人,即使我處置了一切,我有內存泄漏,有什麼建議嗎?提前致謝。並行foreach內存泄漏位圖

private void button3_Click(object sender, EventArgs e) 
    { 
     int W = Convert.ToInt32(txtW.Text); 
     int H = Convert.ToInt32(txtH.Text); 
     Parallel.ForEach(listaslika, slika => 
     { 
      Bitmap bpm = new Bitmap(W, H); 
      Graphics graphic = Graphics.FromImage(bpm); 
      img = Image.FromFile(tbSelect.Text + "\\" + slika); 
      graphic.DrawImage(img, 0, 0, W, H); 
      graphic.Dispose(); 
      img = bpm; 
      ((Button)sender).Enabled = false; 
      string select = Path.GetFileNameWithoutExtension(slika); 
      img.Save(tbSave.Text + "\\" + select + exten[GetSelecetedIndex()]); 
      bpm.Dispose(); 
      img.Dispose(); 
     }); 
+1

你沒有處置產生的圖像實例與Image.FromFile –

回答

0

我預料到看起來更像:

private void button3_Click(object sender, EventArgs e) 
{ 
    int W = Convert.ToInt32(txtW.Text); 
    int H = Convert.ToInt32(txtH.Text); 
    Parallel.ForEach(listaslika, slika => 
    { 
     using (Bitmap bmp = new Bitmap(W, H)) 
     { 
      using (Graphics graphic = Graphics.FromImage(bmp)) 
      { 
       using (FileStream fs = new FileStream(tbSelect.Text + "\\" + slika, System.IO.FileMode.Open)) 
       { 
        using (Image img = Image.FromStream(fs)) 
        { 
         graphic.DrawImage(img, 0, 0, W, H); 
        } 
       } 
      } 

      string select = Path.GetFileNameWithoutExtension(slika); 
      bmp.Save(tbSave.Text + "\\" + select + exten[GetSelecetedIndex()]); 
     }    
    }); 
} 
+0

你可以有選擇地刪除大括號的第二和第三個使用塊爲更好的閱讀 –

+0

感謝您的回答! 但是在角蛋白時間之後,內存使用量降至零。當使用普通的foreach和parallel.forach並且maxdegreeofparallelism = 1時,它就可以。任何想法,我應該做什麼,以使parallel.foreach進展順利? @SirRufo –

+0

這不僅是內存使用,而且該文件將被鎖定,直到圖像實例被丟棄或垃圾收集爲止 –