2016-04-14 3 views
4

Фоновый процесс Excel остается открытым после каждого открытия и чтения файла с помощью Iterop. После запуска метода ниже несколько раз я получаю много фоновых процессов Excel. Я понимаю, что это было задано в разное время, но я пробовал все предложения (и реализовал их в коде ниже), и ничего не получилось. Может кто-то помочь.Excel Фоновый процесс не закрывается

public List<double> ReadExcelFile() 
    { 
     Application excelApp = null; 
     Workbooks workbooks = null; 
     Workbook workBook = null; 
     Worksheet worksheet = null; 
     Range excelRange = null; 
     List<double> sheetValues = new List<double>(); 

     try 
     { 
      excelApp = new Application(); 
      workbooks = excelApp.Workbooks; 
      workBook = workbooks.Open(f_inputFilePath, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
       Type.Missing, Type.Missing); 
      worksheet = workBook.Sheets["Sheet1"]; 
      excelRange = worksheet.UsedRange; 
      object[,] sheetValuesRaw = (object[,])excelRange.get_Value(XlRangeValueDataType.xlRangeValueDefault); 

      for (int i = f_firstNumericValueIndex; i <= sheetValuesRaw.GetLength(0); i++) 
       sheetValues.Add((double)sheetValuesRaw[i, 1]); 
     } 
     finally 
     { 
      workBook.Close(false, Type.Missing, Type.Missing); 
      workbooks.Close(); 

      releaseObject(excelRange); 
      releaseObject(worksheet); 
      releaseObject(workbooks); 
      releaseObject(workBook); 

      excelApp.Quit(); 
      releaseObject(excelApp); 
     } 
     return sheetValues; 
    } 

    private void releaseObject(object obj) 
    { 
     try 
     { 
      Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
     } 
     finally 
     { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 
    } 

ответ

2

У меня было несколько проблем с материалами Excel, которые я провел несколько недель назад. Однако мне удалось решить зависание процесса, обернув метод, который использует функциональность Excel в заявлении try-catch-finally.

Так это будет выглядеть примерно так:

public List<double> MyResults() { 
    try { 
     return ReadExcelFile(); 
    } 
    finally { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

И вы могли бы назвать метод «MyResults» на месте, где когда-либо Вы в настоящее время «ReadExcelFile» называют.

Я обнаружил, что, обернув функциональность Excel в другом цикле try-catch-finally за пределами метода, использующего службы Interop, он позволил битам Excel выйти из области действия и позволить GC собирать их.

+0

Спасибо, что сработало! – TheXela

Смежные вопросы