类型为“System.OutOfMemoryException”的未处理异常发生在 System.Drawing.dll 中。额外信息:内存不足。

6

我有一个名为“images”的列表,其中包含大约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;而不创建新的位图,则不会出现此错误,但是线程中会出现竞争条件异常。

2个回答

4
在将新的位图分配给pictureBox1.Image之前,您可以尝试调用以下内容,以删除先前的“new”位图并释放资源:
pictureBox1.Image.Dispose();

3
谢谢Grant,我想我需要多读一些关于内存泄漏的内容。每当我认为自己已经成为了一名程序员时,我就会意识到自己还有很长的路要走。不管怎样,还是感谢你的帮助。 - Basco

0

我相信你也可以尝试使用using关键字;因为它会确保对象在其作用域结束后立即被处理。你可以这样做:

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

更多细节请查看C#中“using”的用途是什么


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接