2010-05-06 3 views
7

In meiner Form geschlossen Ich bin etwas so einfache wie tunC# Excel Interop: Excel-Prozess bleibt im Speicher, bis Eltern Form

private void btnPrintPickList_Click(object sender, EventArgs e) 
{ 
    using (var salesRpt = new SalesOrder(CurrentItem())) 
    { 
     salesRpt.CreateSpreadSheet(); 
     salesRpt.Dispose(); 
    } 
} 

folgte ich habe die "keine 2 Punkte für Excel-Interop-Regel".

protected ExcelSheet(bool documentVisible, XlPageOrientation orientation) 
{ 
    ExcelApplication = new Application {Visible = documentVisible}; 
    WorkBooks = ExcelApplication.Workbooks; 
    WorkBook = WorkBooks.Add(XlSheetType.xlWorksheet); 
    SheetList = WorkBook.Worksheets; 
    Orientation = orientation; 
    WorkSheet = (Worksheet) ExcelApplication.ActiveSheet; 
} 

public Application ExcelApplication { get; private set; } 
public Workbook WorkBook { get; private set; } 
public Workbooks WorkBooks { get; private set; } 
public Worksheet WorkSheet { get; private set; } 
public Sheets SheetList { get; private set; } 
public XlPageOrientation Orientation { get; private set; } 

die dispose-Methode funktioniert folgendermaßen.

public void Dispose() 
    { 
     for (int i = 1; i <= SheetList.Count; i++) 
     { 
      Marshal.FinalReleaseComObject(SheetList[i]); 
     } 
     //Marshal.FinalReleaseComObject(WorkSheet); 
     Marshal.FinalReleaseComObject(SheetList); 
     Marshal.FinalReleaseComObject(WorkBook); 
     WorkBooks.Close(); 
     Marshal.FinalReleaseComObject(WorkBooks); 
     ExcelApplication.Quit(); 
     Marshal.FinalReleaseComObject(ExcelApplication); 
     WorkSheet = null; 
     SheetList = null; 
     WorkBook = null; 
     WorkBooks = null; 
     ExcelApplication = null; 
    } 

In meinen Tests, wird der EXCEL.exe Prozess nicht konsequent von den aktuellen Prozessen in der Taskleiste entfernt bekommen, sobald die Excel-Tabelle gedruckt wird.

Was mache ich falsch?

Antwort

3

Haben Sie Alternativ GC.Collect()?

versucht Aufruf Sie using{} verwenden können, wenn Sie eine sofortige Garbage-Collection aller Generationen nicht

+0

zwingen will ich die „using“ Anweisung und die Dispose-Methode verwendet hat aufgerufen und abgeschlossen, aber die EXCEl.exe nicht aus dem Task-Manager, bis ich das Formular ausschließe. Ich werde GC.collect() am Ende der Entsorgung versuchen. –

+0

Hinzufügen von GC.Collect(); Am Ende von Dispose() wurde die EXCEl.exe aus dem Task-Manager entfernt. Ein Punkt obwohl. Ich hatte gehört, dass es nicht ratsam ist, GC.Collect() anzurufen. Ist es bei Interop gültig? –

+0

Leider glaube ich nicht, dass es eine andere Option für dieses Szenario gibt! –