首先,我有一张图像(13-15Mb)和其他五张从原始图像复制的图像。完成工作后,我想通过点击Clear Data
按钮处理所有图像。
我使用诊断工具来了解内存的工作原理。结果,dispose
方法有时会起作用,有时不起作用。即使我调用dispose
和GC.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();
}
答案 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);