Zombie Excel让我疯狂

时间:2018-03-21 13:44:15

标签: excel vb.net garbage-collection zombie-process

我有一个程序可以创建excel对象,写入Excel工作表,打印,保存,最后退出。然而,当然,我可以在任务管理器中看到一个excel僵尸,只有在程序完全关闭后才会消失,(但是直到写入excel开始才会消失。)这让我疯了,我读了几十个有关如何使用垃圾收集来解决此问题的示例,但似乎没有工作。我也不想使用杀戮过程,因为这显然不是正确的方法。我也发誓我曾经让它工作过一次,也许当程序没有时,“另存为”一个新的excel表。我相信错误可能是,我只关闭了一个excel表,而新版本的版本保持打开状态。 (使用win 10和Excel 2016)

Dim objExcel As New Microsoft.Office.Interop.Excel.Application()
Dim objWorkbook As Excel.Workbook   'Represents a workbook object
Dim objWorksheet As Excel.Worksheet 'Represents a worksheet object
Dim OrderTemplate As String = "insert file path here"
objWorkbook = objExcel.Workbooks.Open(OrderTemplate)

objExcel.DisplayAlerts = False
objExcel.ActiveWorkbook.Close(SaveChanges:=True)
objExcel.DisplayAlerts = True
objExcel.Quit()
objExcel = Nothing


GC.GetTotalMemory(False)
GC.Collect()
GC.WaitForPendingFinalizers()

GC.Collect()
GC.WaitForPendingFinalizers()
GC.GetTotalMemory(False)


System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorksheet)   
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorkbook)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcel)

Private Sub releaseObject(ByVal obj As Object)
    Try
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj)
        obj = Nothing
    Catch ex As Exception
        obj = Nothing
    Finally
        GC.Collect()
    End Try
End Sub

2 个答案:

答案 0 :(得分:0)

您还需要定义WorkBooks集合,否则它将成为孤儿,您将无法杀死父应用程序:

Imports Excel = Microsoft.Office.Interop.Excel

Dim objExcel As New Excel.Application
Dim objWorkbooks As Excel.Workbooks = objExcel.Workbooks
Dim objWorkbook As Excel.Workbook = objWorkbooks.Open(OrderTemplate)
Dim objWorksheet As Excel.Worksheet = DirectCast(objWorkbook.Sheets(1), Excel.Worksheet)

然后按顺序杀掉对象:

    objWorksheet = Nothing
    objWorkbook.Close(False)
    objWorkbook = Nothing
    objWorkbooks = Nothing
    objExcel.Quit()
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcel)
    objExcel = Nothing
    GC.Collect()

我读过的另一篇文章也说过每个对象(按此顺序):

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorksheet)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorkbook)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objWorkbooks)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcel)

答案 1 :(得分:0)

我刚刚解决了这个问题...... 没有理由要求发布()

只需将您的Excel代码放在私有子中。 示例>

Private sub Excelexc()

'excel code

end sub

然后打电话给它。

Private Sub ButtonPreview_Click(sender As Object, e As EventArgs) Handles ButtonPreview.Click


    ExcelExc()


    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    GC.WaitForPendingFinalizers()


End Sub

还要确保以相反的方式关闭excel对象。

            objExcel1.Visible = True
            objWorkbook1.Sheets.PrintPreview()
            objWorkbook1.Close(SaveChanges:=False)
            objExcel1.Quit()
这是我的。嗯,有很多方法可以修复它,但在某些情况下,甚至很难摆脱双点和类似的东西。 好吧,祝你好运。