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;
    }
}

C# 线程和内存泄漏

例如,如果我们给Excel一个文件类型,它无法打开它将锁定

它可能正在尝试显示一个对话框,告诉用户有关它的信息。 通过设置应用程序来调试它。可见 = true,因此您可以实际看到对话框。 通过在 Open() 调用中指定更多参数来修复它。 "密码"、"通知"和"损坏加载"参数会起作用。 更好地筛选文件是一种明显的解决方法,Excel 确实旨在对问题进行交互和聊天。

你不用太担心线程,Excel 是一个单线程 COM 对象,COM 确保以线程安全的方式调用接口方法。 在您的情况下,这是通过实际创建一个线程来为互操作对象提供一个安全的归宿。

在这里,

您可能希望创建一个对象来扩展MarshalByRefObject可以在新AppDomain中生成该对象以进行转换。完成后,只需卸载AppDomain,所有内存将被清除。