2017-04-03 44 views
1

我需要从dataTable中添加新的工作表。对于这个任务,我用ClosedXML:ClosedXML。内存泄露while Workbook.Save()

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

我的进程使用的内存128 MB但Workbook.Save()后,这个数字上升至382兆。在添加下一个工作表内存使用从464 Mb增加到619 Mb之后。但在这一点上的实际文件是1.6 Mb。

这可能是什么原因?

回答

1

升级到最新版本的ClosedXMLv0.87在这个阶段。在Release配置运行代码并添加以下代码你已经设置在XLWorkbook后:

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

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

3

XLWorkbook实现IDisposable,你应该叫释放其持有的任何资源。如果你不这样做 - 当实例被垃圾收集时,它们只会被释放(假设XLWorkbook实现适当的终结器),这将在未来一段时间发生。你应该做的是这样的:

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

当然更好。将包裹workbookusing陈述或至少使用tryfinally以确保例外的释放,但不直接相关的问题。

+1

还要注意的是,如果你运行'Debug'配置中的应用程序(通常这意味着优化是关闭的),也不能保证安置对象将当你希望他们实际配置。它们的对象通常保存在可以在调试器中查看它们的位置。切换到“释放”配置,以确保处置对象在您期望时收集垃圾。 –