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 ,所有的内存将被清除。