我正在编写一个通过 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;
}
}
最佳答案
for example if we give excel a file type it cannot open it will lock up
它可能试图显示一个对话框来告诉用户它。通过设置 application.Visible = true 进行调试,这样您就可以真正看到对话框。通过在 Open() 调用中指定更多参数来修复它。 Password、Notify 和 CorruptLoad 参数有影响。更好地筛选文件是一个明显的解决方法,Excel 的设计确实是为了交互和讨论问题。
您不必太担心线程,Excel 是单线程 COM 对象,COM 确保以线程安全的方式调用接口(interface)方法。在您的情况下,这是通过实际创建一个新线程来为互操作对象提供一个安全的家。
关于C# 线程和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10849125/