2010-05-06 3 views
7

Nella mia forma che sto facendo qualcosa di semplice comeC# Excel Interoperabilità: processo di Excel rimane in memoria fino a quando forma del genitore chiuso

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

Ho seguito il "no 2 punti regola per eccellere interoperabilità".

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

il metodo di smaltimento fa quanto segue.

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

Nel mio test, il processo EXCEL.exe non sempre vengono rimossi dai processi in corso nella barra delle applicazioni una volta che il foglio di calcolo Excel viene stampato.

Cosa sto sbagliando?

risposta

3

Hai provato chiamando GC.Collect()?

In alternativa, è possibile utilizzare using{} se non si vuole forzare un garbage collection immediata di tutte le generazioni

+0

ho usato il "tramite" l'istruzione e il metodo Dispose fa si chiama e si completa ma EXCEl.exe non esce dal task manager finché non chiudo il modulo. Proverò GC.collect() alla fine della procedura. –

+0

Aggiunta di GC.Collect(); alla fine di Dispose() rimosso EXCEl.exe dal task manager. Un punto però. Avevo sentito che non è consigliabile chiamare GC.Collect(). È valido in caso di interruzione? –

+0

Sfortunatamente, non penso ci sia un'altra opzione per questo scenario! –