2016-07-06 110 views
3

我正在使用下面的方法。執行此代碼塊後,我發現Microsoft Excel仍然通過檢查任務管理器在後臺運行。Excel互操作對象不被釋放

編輯:正好一個 Microsoft Excel後臺進程仍然存在。我剛剛添加了這個功能,因爲當我第一次開始使用Excel和Interop COM對象時,有時許多進程將在函數完成執行後繼續運行。

如何確保在我的當前函數執行後Excel不會在後臺運行?


,因爲一些功能最終需要他們,我聲明這些變量具有全局範圍:

private Excel.Application xls = null; 
private Excel.Workbooks workBooks = null; 
private Excel.Workbook workBook = null; 
private Excel.Sheets sheets = null; 
private Excel.Worksheet workSheet = null; 

此方法可用於檢查是否在給定的工作簿是否存在片:

private bool sheetExists(string searchString) 
{ 
    xls = new Excel.Application(); 
    workBooks = xls.Workbooks; 
    workBook = workBooks.Open(workbookPath); // <- Where the workbook is saved 
    sheets = workBook.Sheets; 

    bool isFound = false; 

    foreach (Excel.Worksheet sheet in sheets) 
    { 
     // Check the name of the current sheet 
     if (sheet.Name == searchString) 
     { 
      Marshal.ReleaseComObject(sheet); 
      isFound = true; 
      break; 
     } 

     Marshal.ReleaseComObject(sheet); 
    } 

    cleanUp(true, xls, workBooks, workBook, sheets); 

    return isFound; 
} 

此功能用於釋放COM對象:

private void cleanUp(bool saveTrueFalse, params object[] comObjects) 
{ 
    workBook.Close(saveTrueFalse); 

    xls.Application.Quit(); 
    xls.Quit(); 

    foreach (object o in comObjects) 
    { 
     Marshal.ReleaseComObject(o); 
    } 

    workSheet = null; 
    sheets = null; 
    workBook = null; 
    workBooks = null; 
    xls = null; 

    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
} 
+0

又一個不瞭解垃圾收集器如何工作的例子。這裏已經覆蓋了很多次,[喜歡這裏](http://stackoverflow.com/questions/25134024/clean-up-excel-interop-objects-with-idisposable/25135685#25135685)。 –

回答

-1

我希望看到一個合適的解決方案,但這種破解是我能夠實現它的唯一方法。看起來,互操作庫在告訴時關閉流程時並不擅長。如果在線程中運行,則會爲每個線程啓動進程。通過按名稱掃描進程並跟蹤新進程,我會跟蹤進程ID。我在服務器上這樣做,所以我知道所有進程都是互操作啓動的,而不是由實際用戶啓動的。在我完成邏輯之後,我會啓動一個計時器,每分鐘都會嘗試終止進程。最終它會關閉它。我還有一些代碼可以在啓動時終止任何Excel進程,以防上次運行應用程序時未正確處理它們。

讓我知道你是否想要通過名稱或ID查殺進程的示例代碼。我沒有現成的,或快速的搜索應該帶來一些好的樣本。

+0

選民請解釋。這可能不是一個理想的解決方案,但它確實有效。我甚至提到我也想知道一個理想的解決方案。 – ManOVision