无法处理图像 - 内存不足

时间:2018-04-09 07:28:32

标签: c# .net image garbage-collection out-of-memory

首先,我有一张图像(13-15Mb)和其他五张从原始图像复制的图像。完成工作后,我想通过点击Clear Data按钮处理所有图像。

我使用诊断工具来了解内存的工作原理。结果,dispose方法有时会起作用,有时不起作用。即使我调用disposeGC.Collect()方法,内存仍会增加,导致内存不足异常。我不知道为什么这样不稳定。

以下是处理数据的方法:

private void ResetDataPatient()
{
    GC.Collect();
    imgBox.Image.Dispose();
    imgBox.Image = Properties.Resources.defaultpicture;
    if (xrayPic != null)
    {
        xrayPic.Dispose();
    }
    if (rootPic != null)
    {
        rootPic.Dispose();
    }
    if (tmppic != null)
    {
        tmppic.Dispose();
    }
    if (tmppicCheck != null)
    {
        tmppicCheck.Dispose();
    }
    if (originalPic != null)
    {
        originalPic.Dispose();
    }
    if (PatienData != null)
    {
        PatienData.Clear();
        PatienData.Dispose();
        PatienData = null;
    }

    GC.Collect();
}

3 个答案:

答案 0 :(得分:2)

您只需要处理从资源(例如从文件)创建的图像。如果使用 <ul> <li *ngFor="let hero of heroes" (@flyInOut.start)="animationStarted($event)" (@flyInOut.done)="animationDone($event)" [@flyInOut]="'in'"> {{hero.name}} </li> </ul>方法创建副本,则无需处置它们。您只需要将变量引用设置为clone()即可清除变量引用。无需手动调用null

GC

答案 1 :(得分:1)

在处置后只需将属性设置为null:

private void ResetDataPatient() {
    imgBox.Image.Dispose();
    imgBox.Image = Properties.Resources.defaultpicture;
    if (xrayPic != null)
    {
        xrayPic.Dispose();
        xrayPic = null;
    }
    if (rootPic != null)
    {
        rootPic.Dispose();
        rootPic = null;
    }
    if (tmppic != null)
    {
        tmppic.Dispose();
        tmppic = null;
    }
    if (tmppicCheck != null)
    {
        tmppicCheck.Dispose();
        tmppicCheck = null;
    }
    if (originalPic != null)
    {
        originalPic.Dispose();
        originalPic = null;
    }
    if (PatienData != null) {
        PatienData.Clear();
        PatienData.Dispose();
        PatienData = null;
    }
}

答案 2 :(得分:0)

图像将转到大对象堆(LOH)。如果您运行的是32位或更低版本的框架版本,而不是4.5,则可能会受到影响。以下是有关.net 4.5更改的更多信息。 LOH improvements in .NET 4.5

您也可以尝试运行此代码以尽可能多地收集(MSDN link

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(2, GCCollectionMode.Forced, true, true);