【问题标题】:Excel instance not getting killed in task manager VB.netExcel 实例没有在任务管理器 VB.net 中被杀死
【发布时间】:2017-07-10 04:18:42
【问题描述】:

一旦按钮执行结束,任务管理器中的 Excel 实例 (excel.exe) 不会被杀死。

Private Sub Extract_Click(sender As Object, e As EventArgs) Handles Extract.Click
    Dim xlApp As New Excel.Application
    Dim wbXLsource As Excel.Workbook
    Dim wbXLtarget As Excel.Workbook
    Dim shXLsource As Excel.Worksheet
    Dim shXLtarget As Excel.Worksheet
    Dim datestart As Date = Date.Now
    wbXLsource = xlApp.Workbooks.Open(xlSourcePath)
    wbXLtarget = xlApp.Workbooks.Open(xlTargetPath)
    Dim dateEnd As Date = Date.Now
    End_Excel_App(datestart, dateEnd)
End Sub

Private Sub End_Excel_App(datestart As Date, dateEnd As Date)
    Dim xlp() As Process = Process.GetProcessesByName("EXCEL")
    For Each Process As Process In xlp
      If Process.StartTime >= datestart And Process.StartTime <= dateEnd Then
        Process.Kill()
        Exit For
    End If
    Next
End Sub

我也尝试使用垃圾收集器概念,但只有在关闭应用程序后,excel 实例才会被杀死。按钮执行结束后,我需要关闭 excel 实例(excel.exe)

【问题讨论】:

  • 如果内存正常,Excel 工作簿上有一个 close 方法可以绕过这个骇客,并在被调用时正确关闭文档(和 excel 实例)。
  • 您在获取开始时间之前启动应用程序......日期时间比您想象的要精细得多。但正如@user2366842 所说.. 有一种方法可以正确地做到这一点。

标签: excel vb.net


【解决方案1】:

通过调用xlApp.Quit() 关闭应用程序会关闭它,但不会从内存中删除。

要同时释放内存,你可以按照Siddharth Rout's excellent answer给出的建议:

Private Sub ReleaseObject(ByVal obj As Object)
    Try
        Dim intRel As Integer = 0
        Do
            intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
        Loop While intRel > 0
        MsgBox("Final Released obj # " & intRel)
    Catch ex As Exception
        MsgBox("Error releasing object" & ex.ToString)
        obj = Nothing
    Finally
        GC.Collect()
    End Try
End Sub

【讨论】:

  • 调用xlApp.Quit()会关闭excel,但不会杀死任务管理器中的excel实例(excel.exe)
  • 你说得对,我搞砸了我的测试。我在 SO 上找到了关于此主题的另一个答案,并更新了我的答案以链接到它。
  • 这个问题也存在。即使在按钮执行结束后,excel.exe 实例仍保留在任务管理器中
【解决方案2】:

使用此代码....我一直在使用它,每次都会关闭

For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
   If proc.MainWindowTitle.Trim() = "" Then
         proc.Kill()
   End If
Next

如果您有 Try Catch 错误处理程序...

Try

     'stuff more stuff

Catch Ex as Exception 

      For Each Proc in System.......
      ......
      Next
Finally
       GC.Collect()
End Try

每次都有效。

【讨论】:

  • 或只是If proc.MainWindowHandle = IntPtr.Zero Then
  • 谢谢 BobSki。当没有打开其他 excel 时,此代码可以正常工作。但是,如果打开了其他一些 excel(除了在 VB.net 中调用的那些),则代码不起作用。你能为此提出一些建议吗?
  • 啊,你是对的,你为什么不试试@Slai 的建议?
  • @Gurpreet .MainWindowTitle 当进程没有主窗口时是null,所以null.Trim 会导致异常。如果我没记错的话,它只适用于没有主窗口且当前未被您的应用程序使用或引用的进程
  • 是的,它的工作方式与@Slai 相同。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多