C# 线程和内存泄漏
本文关键字:泄漏 内存 线程 | 更新日期: 2023-09-27 18:36:04
我正在编写一个通过互操作打开Microsoft Excel的应用程序。
我遇到的问题是,如果应用程序本身锁定或内存泄漏,我的应用程序将被阻止并且不会继续线程。
我有一个父线程,它查看目录并为每个文件循环写入
Convert("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;
}
}
例如,如果我们给Excel一个文件类型,它无法打开它将锁定
它可能正在尝试显示一个对话框,告诉用户有关它的信息。 通过设置应用程序来调试它。可见 = true,因此您可以实际看到对话框。 通过在 Open() 调用中指定更多参数来修复它。 "密码"、"通知"和"损坏加载"参数会起作用。 更好地筛选文件是一种明显的解决方法,Excel 确实旨在对问题进行交互和聊天。
你不用太担心线程,Excel 是一个单线程 COM 对象,COM 确保以线程安全的方式调用接口方法。 在您的情况下,这是通过实际创建一个新线程来为互操作对象提供一个安全的归宿。
在这里,
您可能希望创建一个对象来扩展MarshalByRefObject
可以在新AppDomain
中生成该对象以进行转换。完成后,只需卸载AppDomain
,所有内存将被清除。