首页 > 解决方案 > 此 IDisposable 代码是否需要类对象的手动 .Dipose() ?

问题描述

Implements Idisposable在 Class 对象中使用,因为在调用 Class 中的方法内的 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?)

问题是是否需要上面的 myproc.Dispose() 代码,给定 IDiposable 代码?我不能很好地解释 IDisposable 代码,但看起来确实有一些技巧将类分配为托管代码,所以它不会被 GC 杀死(?)

标签: vb.neterror-handlingcallbackidisposable

解决方案


推荐阅读