[英]Limiting Memory Leak on object not under your control
我有一个由其他人创建的方法,无法访问源。 此方法在文件系统上创建PDF文档,但是当我开始传递200多个图像时,内存出现问题。 据我所知,它将对象加载到内存中以呈现PDF,然后输出到文件系统。 当我使用for或foreach循环遍历我的文件并输出它们时,我可以在任务管理器中看到内存的建立速度很慢,它的确会不时地下降,但是总的来说它总是在增加。
这是我的代码:
for(int i = 0; i < Documents.Count; i++)
{
IDocument document = Documents[i];
try
{
string exportFileName = string.Format("{0}_{1}_{2}_{3}", batchName, document.Field("NHS File\\SectionName").Text, document.Field("NHS File\\Classification Result").Text, dateTime);
string imageFileName = exportFileName;
int tries = 0;
while (File.Exists(Path.Combine(processingLocation, imageFileName + ".pdf")))
{
imageFileName = string.Format("{0}_{1}", exportFileName, tries++);
}
document.SaveAs((Path.Combine(processingLocation, imageFileName)), ExportOptions.GetImageOptions());
}
catch(Exception ex)
{
Processing.ReportError(ex.ToString());
return;
}
finally
{
Marshal.ReleaseComObject(document);
Marshal.FinalReleaseComObject(document);
document = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
问题出在“ document.SaveAs();” 我曾尝试调用垃圾回收器并释放COM对象,从而增加和消除了内存压力,但似乎无济于事,我不断收到“ System.Runtime.InteropServices.COMException(0x80004005):内存不足!” 当达到200个文件时。
似乎没有close(),Dispose()或Finalise()选项。
有没有一种方法可以调用此document.SaveAs(),以便由我控制和释放对象使用的内存?
提前致谢。
如果您无法控制第三方代码,则几乎没有清除内存的选项。 代码的性质似乎暗示着它在COM Interop或平台调用中很繁重,如果操作不当,这无疑是泄漏内存的有效方法。 GC.Collect
不会收集本机分配的内存,因为它在垃圾收集器的知识范围之外。
我建议您将逻辑放在单独的流程中,并在处理完成后退出流程。 退出进程是清理资源和内存的非常可靠的方法。
将代码移至控制台应用程序,然后使用Process.Start从当前代码启动新的命令行实用程序。 如果要同步执行,请使用WaitForExit
,并且可以将参数传递给进程,例如要处理的文件或目录的路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.