2017-05-18 41 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

这不仅是内存使用,而且该文件将被锁定,直到图像实例被丢弃或垃圾收集为止 –