Vb.net 此IDisposable代码是否需要类对象的manual.Dipose()?
我在类对象内使用Vb.net 此IDisposable代码是否需要类对象的manual.Dipose()?,vb.net,error-handling,callback,idisposable,Vb.net,Error Handling,Callback,Idisposable,我在类对象内使用实现Idisposable,因为在调用类中方法内的DLL时引发回调异常。我们的想法是,当DLL仍在处理时,类过早地进行了垃圾收集 但是,我发现并使用了MSDN(如下)中的一些代码,并将课程结束时自动创建的代码替换为该代码,它似乎可以工作: #Region "IDisposable" '---Code entirely copied from MSDN Private managedResource As System.ComponentMod
实现Idisposable
,因为在调用类中方法内的DLL时引发回调异常。我们的想法是,当DLL仍在处理时,类过早地进行了垃圾收集
但是,我发现并使用了MSDN(如下)中的一些代码,并将课程结束时自动创建的代码替换为该代码,它似乎可以工作:
#Region "IDisposable"
'---Code entirely copied from MSDN
Private managedResource As System.ComponentModel.Component
Private unmanagedResource As IntPtr
Protected disposed As Boolean = False
Protected Overridable Overloads Sub Dispose(
ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
Try
managedResource.Dispose()
Catch
End Try
End If
' Add code here to release the unmanaged resource.
unmanagedResource = IntPtr.Zero
' Note that this is not thread safe.
End If
Me.disposed = True
End Sub
'Private Sub AnyOtherMethods()
'If Me.disposed Then
'Throw New ObjectDisposedException(Me.GetType().ToString, "This object has been disposed.")
'End If
'End Sub
'Do not change or add Overridable to these methods.
'Put cleanup code in Dispose(ByVal disposing As Boolean).
Public Overloads Sub Dispose() Implements IDisposable.Dispose
' Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overrides Sub Finalize()
' Dispose(False)
MyBase.Finalize()
End Sub
#End Region
有一个警告:如果在实例化类之后,我循环并等待在类内的方法(调用DLL)末尾将全局布尔参数设置为true,然后处置该对象,则会出现回调错误
Public ProcFinished As Boolean
Public Class ProcClass
Sub New(param1, param2, param3)
MyMethodThatCallsDLL(param1, param2, param3)
End Sub
Sub MyMethodThatCallsDLL(param1, param2, param3)
'Call DLL
ReferenceName.DLLName(param1, param2, param3)
'...do some math...
ProcFinished = True
End Sub
End Class
'...somewhere else in Project
ProcFinished = False
Dim myproc As New ProcClass(param1, param2, param3)
Do Until ProcFinished = True 'waits till Public ProcFinished is True
Loop
myproc.Dispose() '(don't know if this is needed?)
问题是,给定IDiposable代码,是否需要上面的myproc.Dispose()代码?我无法很好地解释IDisposable代码,但将类指定为托管代码看起来确实有一些技巧,因此它不会被GC杀死(?)为您的类实现IDisposable意味着您可以(也许应该)为ProcClass实例使用using模式,然后调用Dispose方法是不存在问题的。您已经注释掉了
Dispose(True)
和Dispose(False)
,因此您的类从未对Dispose
执行任何操作。unmanagedResource=IntPtr.Zero
看起来也不像清理非托管资源。如果您取消对它们的注释,并在Dispose(ByVal disposing为Boolean)
中放置适当的资源清理,那么您的类就可以被释放了。这应该用它来完成。有关IDisposable
的更好解释,请参阅。解决此问题的正确方法是:“认为类在DLL仍在处理时过早地进行垃圾收集。”而不是实现IDisposable
。解决此问题的正确方法是确保在DLL仍在处理时仍保留对类的引用,以便不会对其进行垃圾收集。^执行此操作。需要放置的资源。[…]它用于处置类在活动时创建的非托管资源。标准的public Dispose()
方法调用受保护的Dispose(true)
方法,该方法负责(当参数为true
时)处理这些一次性对象GC.SuppressFinalize(Me)
旨在提示GC类已经执行了必要的清理,但它不会阻止类被处理(甚至更少地完成)。--您应该发布初始化该类对象的实际代码和所描述操作的上下文,这在这里很重要。