C# 带位图的并行foreach内存泄漏

C# 带位图的并行foreach内存泄漏,c#,memory-leaks,parallel.foreach,C#,Memory Leaks,Parallel.foreach,我想选择多个(在我的例子中是77个)图像,并将它们转换为其他大小和格式。 我制作了一个Ilist(string)listaslika,其中包含文件夹中图像的名称列表。tbSelect是一个文本框,其中包含图像来源的文件夹路径,tbSave包含将保存图像的文件夹。 现在我想调整它们的大小,即使我处理了所有的东西,我有内存泄漏,有什么建议吗?提前谢谢 private void button3_Click(object sender, EventArgs e) { int W

我想选择多个(在我的例子中是77个)图像,并将它们转换为其他大小和格式。 我制作了一个Ilist(string)listaslika,其中包含文件夹中图像的名称列表。tbSelect是一个文本框,其中包含图像来源的文件夹路径,tbSave包含将保存图像的文件夹。 现在我想调整它们的大小,即使我处理了所有的东西,我有内存泄漏,有什么建议吗?提前谢谢

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();
       });

我希望它看起来更像:

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()]);
        }               
    });
}

您没有处理使用image.fromfile创建的图像实例。您可以选择使用block删除第二个和第三个图像实例的花括号,以便更好地阅读感谢您的回答!但在ceratin之后,时间内存使用率降至零。当使用常规foreach和parallel.forach且maxdegreeofparallelism=1时,一切正常。你知道我该怎么做才能让平行的foreach顺利进行吗@SirRufoIt不仅是内存使用,而且文件将被锁定,直到映像实例被释放或成为垃圾collected@JulianCosta你有比内存泄漏更多的问题吗?为什么这不在你的问题中?工作原理:你问一个问题,我们回答这个问题。您可以编辑问题以澄清问题,但不要扩展问题或提出完全不同的问题。在这种情况下,问一个新问题