C#线程和内存泄漏
我正在编写一个通过Interop打开Microsoft Excel的应用程序。
我遇到的问题是如果应用程序本身locking或内存泄漏,我的应用程序被阻止,将不会继续线程。
我有一个父线程查看目录,并在每个文件的循环中写入
转换( “src.xls”, “src.pdf”,NULL); 有时候,例如,如果我们给excel文件types,它不能打开它将locking。 这将locking我的线程,迫使我不得不杀死进程。
public static class ExcelConverter { public static bool Convert(string srcFile, string destinationFile, object[] parameters) { bool bStatus = false; Workbook excelWorkBook = null; Excel.Application application = null; try { application = new Excel.Application(); object missingParam = Type.Missing; excelWorkBook = application.Workbooks.Open(srcFile); if (excelWorkBook != null) { excelWorkBook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, destinationFile); } bStatus = true; } catch (Exception) { bStatus = false; } finally { if (excelWorkBook != null) { excelWorkBook.Close(false); excelWorkBook = null; } if (application != null) { application.Quit(); application = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } return bStatus; } }
例如,如果我们给excel一个文件types,它不能打开它将locking
它可能试图显示一个对话框告诉用户。 通过设置application.Visible = true来debugging,这样你就可以看到对话框。 通过在Open()调用中指定更多参数来修复它。 密码,通知和CorruptLoad参数有一个效果。 更好地筛选文件是一个显而易见的解决方法,Excel的devise真的是交互式的,并且对问题进行讨论。
您不必担心线程太多,Excel是一个单线程的COM对象,COM确保以线程安全的方式调用接口方法。 在你的情况下,通过实际创build一个新的线程来赋予互操作对象一个安全的家庭。
在这里你可能想创build一个扩展MarshalByRefObject
对象的对象,你可以在新的AppDomain
产生这个对象来完成转换。 完成后,只需卸载AppDomain
,所有的内存将被清除。
- C#:MS Excel中checkbox的状态
- C#Interop非可调用成员“Microsoft.Office.Interop.Excel.Range.End”不能像方法一样使用
- 如何在excel中alignment图片
- 将数据导出到Excel电子表格
- 为什么我必须投Excel.Cells但不Excel.End?
- C#和Excel互操作
- 实时插入到Excel单元格中
- 我可以将Microsoft.Office.Interop.Excel.Chart对象转换为Microsoft.Office.Tools.Excel.Chart对象吗?
- Excel InterOp:如何WorkBook.SaveAs使用绝对path时,不允许使用“:”?