2012-06-01 88 views
1

我正在编写一个通过Interop打开Microsoft Excel的应用程序。C#线程和内存泄漏

我遇到的问题是,如果应用程序本身锁定或内存泄漏,我的应用程序将被阻止,并且不会继续该线程。

我有一个看起来在一个目录,在一个循环中写道:为每个文件父线程

转换(“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; 
    } 
} 
+0

你应该找出为什么你有内存泄漏,检查和查杀你的应用程序将不会帮助你长期。 – Peter

+2

我建议你发布一些代码,这样人们可以告诉你潜在的问题可能在哪里。尽管你认为我们是心灵感应的,但我们也不知道你的'ConvertToExcel()'方法是干什么的! – Bridge

+1

你为什么决定,这个内存泄露了Excel的问题而不是你的代码? – Dennis

回答

3

例如,如果我们给Excel中的文件类型,它不能打开它会锁定

它可能正试图显示一个对话框,告诉用户它。通过设置application.Visible = true来调试,这样你就可以看到对话框。通过在Open()调用中指定更多参数来修复它。 Password,Notify和CorruptLoad参数有效。更好地筛选文件是一个显而易见的解决方法,Excel的设计真正是互动的,并且对问题进行讨论。

您不必担心线程过多,Excel是单线程COM对象,COM确保以线程安全的方式调用接口方法。在你的情况下,通过创建一个新的线程来实现互操作对象是一个安全的家庭。

2

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