【问题标题】:An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll Additional information: Out of memorySystem.Drawing.dll 中出现“System.OutOfMemoryException”类型的未处理异常附加信息:内存不足
【发布时间】:2013-03-07 15:04:00
【问题描述】:

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

【问题讨论】:

    标签: c# winforms bitmap clone


    【解决方案1】:

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

    pictureBox1.Image.Dispose();
    

    【讨论】:

    • 谢谢格兰特,我想我需要阅读更多关于内存泄漏的信息。每当我认为我已经成为一名程序员时,我就会意识到我还很遥远。无论如何感谢您的帮助。
    【解决方案2】:

    我相信你也可以尝试使用using关键字;因为它将确保对象在其作用域之后直接被释放。你可以这样:

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

    更多详情请关注What are the uses of “using” in C#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多