2017-04-03 164 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'配置中的應用程序(通常這意味着優化是關閉的),也不能保證安置對象將當你希望他們實際配置。它們的對象通常保存在可以在調試器中查看它們的位置。切換到「釋放」配置,以確保處置對象在您期望時收集垃圾。 –