C#线程和内存泄漏

时间:2012-06-01 11:08:27

标签: 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;
    }
}

2 个答案:

答案 0 :(得分:3)

  

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

可能正在尝试显示一个告诉用户的对话框。通过设置application.Visible = true来调试它,以便您可以实际看到对话框。通过在Open()调用中指定更多参数来修复它。 Password,Notify和CorruptLoad参数有效。更好地筛选文件是一个显而易见的解决方法,Excel实际上是为交互式和讨论问题而设计的。

您没有太多担心线程,Excel是单线程COM对象,COM确保以线程安全的方式调用接口方法。在您的情况下,通过实际创建 new 线程来为interop对象提供安全的家庭,这是做什么的。

答案 1 :(得分:2)

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