Vb.net 终止Excel进程不工作w/GC(是的,另一个)
我已经阅读了我能找到的关于这个的每一篇文章,并且认为我正确地处理了它。但我有一个Excel COM进程,它仍然在运行。我知道它在哪里(请参阅caps中的注释),也知道它为什么会挂起(它使用Split(Range)调用,创建两个COM对象) 但我还是不知道如何杀死第二个物体。我认为等待GC的待定终结器可以处理这两个问题,但运气不好。我错过了什么Vb.net 终止Excel进程不工作w/GC(是的,另一个),vb.net,garbage-collection,Vb.net,Garbage Collection,我已经阅读了我能找到的关于这个的每一篇文章,并且认为我正确地处理了它。但我有一个Excel COM进程,它仍然在运行。我知道它在哪里(请参阅caps中的注释),也知道它为什么会挂起(它使用Split(Range)调用,创建两个COM对象) 但我还是不知道如何杀死第二个物体。我认为等待GC的待定终结器可以处理这两个问题,但运气不好。我错过了什么 Private Sub PopulateSensorSizes(ByVal newContFlag As Boolean) Dim oExcel
Private Sub PopulateSensorSizes(ByVal newContFlag As Boolean)
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
Dim oSheet As Excel.Worksheet
Dim Values() As String
oExcel = New Excel.Application 'Create a new instance of Excel
oBook = oExcel.Workbooks.Open(ControllerParamFilePath) 'Get correct existing Controller file
oSheet = oExcel.Worksheets(1)
oExcel.Visible = False 'Don't show it to the user
'Show sensor sizes
Values = Split(oSheet.Range("B2").Value, "," & " ") 'Split text. TWO COM OBJECTS LAUNCHED HERE
Dim i As Integer
For i = 0 To UBound(Values)
SelectSensorSize.Items.Add(Values(i)) 'Add all integer sensor sizes to ListBox1
Next i
oBook.Close() 'Disconnect from Excel and end processes
oExcel.Quit()
oBook = Nothing
oExcel = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
SelectSensorSize.Items.Add("Enter new sensor size")
End Sub
编辑:我试图重写这个,试图消除“两点”问题,但我得到了相同的结果:一个进程仍在运行
Private Sub PopulateSensorSizes(ByVal newContFlag As Boolean)
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
Dim oSheet As Excel.Worksheet
Dim Values() As String
Dim ValRange as Excel.Range
oExcel = New Excel.Application 'Create a new instance of Excel
oBook = oExcel.Workbooks.Open(ControllerParamFilePath) 'Get correct existing Controller file
oSheet = oExcel.Worksheets(1)
oExcel.Visible = False 'Don't show it to the user
'Show sensor sizes
ValRange = oSheet.Range("B2")
Values = Split(ValRange.Value, "," & " ") 'Split text. TWO COM OBJECTS LAUNCHED HERE
Dim i As Integer
For i = 0 To UBound(Values)
SelectSensorSize.Items.Add(Values(i)) 'Add all integer sensor sizes to ListBox1
Next i
oBook.Close() 'Disconnect from Excel and end processes
oExcel.Quit()
oBook = Nothing
oExcel = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
SelectSensorSize.Items.Add("Enter new sensor size")
End Sub
拆分函数中有什么?您是否尝试过分离函数以查看它在何处创建两个对象?如果是对Range的调用,您可以尝试使用不同的函数,如.Cells(2,2).valuesplit函数是一个标准的MS函数:[link]我还尝试将GC调用重新定位到调用此方法的位置之后,如另一个线程中所建议的,结果还是一样:一个进程继续运行。我上面提到的线程是Hans Passant的:有趣的是,你解决了自己的问题。如何在不使用对现有excel工作簿/应用程序等的引用的情况下调用split函数。如果您能够在不创建另一个实例的情况下找到如何调用它,或者如果您能够找到该实例,您就能够清理它。split函数中有什么?您是否尝试过分离函数以查看它在何处创建两个对象?如果是对Range的调用,您可以尝试使用不同的函数,如.Cells(2,2).valuesplit函数是一个标准的MS函数:[link]我还尝试将GC调用重新定位到调用此方法的位置之后,如另一个线程中所建议的,结果还是一样:一个进程继续运行。我上面提到的线程是Hans Passant的:有趣的是,你解决了自己的问题。如何在不使用对现有excel工作簿/应用程序等的引用的情况下调用split函数。如果您能够在不创建另一个实例的情况下找到如何调用该函数,或者如果您能够找到该实例,则可以将其清理干净。