C# 线程和内存泄漏

标签 c# multithreading excel interop

我正在编写一个通过 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/

相关文章:

c# - 如何解析出 MS Word 格式?

arrays - 在大范围内解析为数组 VBA 的最有效方法

VBA正For循环,负步骤

c# - 使用正则表达式在 svg 文件中查找替换为 '(' 和 ')' 字符的文本

c# - GridView - 打开带有 ID 的新标签自定义按钮

c# - 删除对对象的引用时结束线程

c# - .NET Core 中的异步日志记录范围

java - 单元测试-为什么我的单元测试在使用finish(),处理程序和线程的代码上失败?

excel - 将两列列表转换为 Excel 中的表格

c# - 测试设备是否始终在线/始终连接 (AOAC) 或支持连接待机?