C# 类型为';的未处理异常;System.OutOfMemoryException';在System.Drawing.dll中发生其他信息:内存不足

C# 类型为';的未处理异常;System.OutOfMemoryException';在System.Drawing.dll中发生其他信息:内存不足,c#,winforms,bitmap,clone,C#,Winforms,Bitmap,Clone,我有一个“图片”列表,其中包含大约20张照片,每张大约1MB。我想通过单击“下一步”按钮滚动列表中的图像。但是大约拍了8张照片之后,我就忘记了 private void button4_Click(object sender, EventArgs e) //next { index++; if (index >= images.Count) index = 0; CurrImage = images[index];

我有一个“图片”列表,其中包含大约20张照片,每张大约1MB。我想通过单击“下一步”按钮滚动列表中的图像。但是大约拍了8张照片之后,我就忘记了

    private void button4_Click(object sender, EventArgs e) //next
    {
        index++;
        if (index >= images.Count) index = 0;
        CurrImage = images[index]; 
        Bitmap b = new Bitmap((Bitmap)CurrImage.Clone()); //breakpoint occurs her
        pictureBox1.Image = b; 

        NewThread = new Thread(new ThreadStart(ChooseColors2));
    }
ChooseColors2线程将使用“CurrImage”,因此为了避免竞争条件,我通过创建一个新位图来避免这种情况,如上图所示


请注意,如果我使用pictureBox1.Image=CurrImage;在不创建新位图的情况下,我不会收到此错误,但线程将出现竞态条件异常。

在将新位图分配给pictureBox1.Image之前,可以尝试调用以下命令,以删除以前的“新”位图并释放资源:

pictureBox1.Image.Dispose();

我相信你也可以尝试使用
关键字;因为它将确保直接在对象的作用域之后处理对象。您可以这样做:

using (Bitmap b = new Bitmap((Bitmap)CurrImage.Clone()))
{
    pictureBox1.Image = b;
}`

有关更多详细信息,请查看。

谢谢Grant,我想我需要阅读更多关于内存泄漏的信息。每当我想到自己已经成为一名程序员时,我就会意识到自己还差很远。无论如何谢谢你的帮助。