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类已经执行了必要的清理,但它不会阻止类被处理(甚至更少地完成)。--您应该发布初始化该类对象的实际代码和所描述操作的上下文,这在这里很重要。