我正在编写一个通过Interop打开Microsoft Excel的应用程序。
我遇到的问题是如果应用程序本身锁定或内存泄漏,我的应用程序将被阻止,并且不会继续该线程。
我有一个父线程,它查看目录并在每个文件的循环中写入
转换( “src.xls”, “src.pdf”,NULL);有时候说,例如,如果我们给excel一个文件类型它无法打开它会锁定。这将锁定我的线程,迫使我必须杀死进程。
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;
}
}
答案 0 :(得分:3)
例如,如果我们给excel一个文件类型,它就无法打开它会锁定
可能正在尝试显示一个告诉用户的对话框。通过设置application.Visible = true来调试它,以便您可以实际看到对话框。通过在Open()调用中指定更多参数来修复它。 Password,Notify和CorruptLoad参数有效。更好地筛选文件是一个显而易见的解决方法,Excel实际上是为交互式和讨论问题而设计的。
您没有太多担心线程,Excel是单线程COM对象,COM确保以线程安全的方式调用接口方法。在您的情况下,通过实际创建 new 线程来为interop对象提供安全的家庭,这是做什么的。
答案 1 :(得分:2)
在这里,您可能希望创建一个扩展MarshalByRefObject
对象的对象,您可以在新的AppDomain
中生成该对象以进行转换。完成后,只需卸载AppDomain
即可清除所有内存。