2016-04-14 9 views
4

Ein Excel-Hintergrundprozess bleibt nach jedem Öffnen und Lesen einer Datei mit Iterop geöffnet. Nachdem ich die untenstehende Methode einige Male ausgeführt habe, habe ich eine Menge Excel Hintergrundprozesse. Ich weiß, dass dies schon mehrmals gefragt wurde, aber ich habe alle Vorschläge ausprobiert (und sie im unten stehenden Code implementiert) und nichts hat funktioniert. Könnte jemand bitte helfen.Excel-Hintergrundprozess schließt nicht

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

Antwort

2

Ich hatte ein paar Probleme mit dem Excel-Interop-Zeug selbst ein paar Wochen zurück. Ich schaffte es jedoch, den Prozess zu lösen, indem ich die Methode, die die Excel-Funktionalität verwendet, in eine try-catch-finally-Anweisung einpackte.

So wäre es etwa so aussehen:

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

Und Sie würden die ‚MyResults‘ -Methode anstelle von nennen, wo immer Sie gerade haben ‚ReadExcelFile‘ genannt zu werden.

Ich fand, dass die Excel-Funktionalität in eine andere try-catch-finally-Schleife außerhalb der Methode mit den Interop-Diensten eingeschlossen wurde, so dass die Excel-Bits den Gültigkeitsbereich überschritten haben und der GC sie sammeln konnte.

+0

Danke, das hat funktioniert! – TheXela