【问题标题】:ClosedXML. Memory leak while Workbook.Save()关闭XML。 Workbook.Save() 时内存泄漏
【发布时间】:2017-04-03 09:08:47
【问题描述】:

我需要从 dataTable 添加新的工作表。对于这个任务,我使用 ClosedXML:

workbook.Worksheets.Add(dataTable);
workbook.Save();
workbook = new XLWorkbook(filePath); //reload file to avoid exception at next saving

我的进程使用了​​ 128 Mb 的内存,但在 Workbook.Save() 之后,这个数字上升到 382 Mb。添加下一个工作表后,内存使用量从 464 Mb 上升到 619 Mb。但此时的实际文件为 1.6 Mb。

这可能是什么原因?

【问题讨论】:

    标签: c# excel memory-leaks closedxml


    【解决方案1】:

    XLWorkbook 实现了IDisposable,您应该调用它来释放它所拥有的任何资源。如果你不这样做 - 它们只会在实例被垃圾收集时被释放(假设XLWorkbook 实现了正确的终结器),这将在未来的某个时间发生。你应该这样做:

    workbook.Save();
    workbook.Dispose(); // < important
    workbook = new XLWorkbook(filePath);
    

    当然,最好将workbook 包装到using 语句中,或者至少使用tryfinally 以确保在异常时释放,但这与问题没有直接关系。

    【讨论】:

    • 另请注意,如果您在Debug 配置中运行应用程序(通常意味着优化已关闭),则无法保证已处置的对象会在您期望的时候被实际处置。通常会保留它们的对象,以便您可以在调试器中查看它们。切换到Release 配置,以确保处置的对象在您期望的时候被垃圾回收。
    【解决方案2】:

    在此阶段升级到最新版本的ClosedXML,即v0.87。运行Release配置中的代码,并在你处理完XLWorkbook后添加以下代码:

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    

    您应该注意到内存回落到可接受的水平。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 2013-03-29
      • 2010-11-28
      • 2018-08-26
      • 2013-07-12
      • 2012-09-10
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多