繁体   English   中英

限制不受您控制的对象的内存泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM