vb.net - 此 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 杀死(?)
解决方案
推荐阅读
- python - 如果我在尝试检索值时指定参数,则会出现“对象不可调用”错误
- java - 我如何正确引用此代码中的石头重量?
- javascript - 扩展 Object.setPrototypeOf() 与 Object.create
- amazon-web-services - 如何使用 Amazon ECS 运行 docker 任务 - 出现错误`STOPPED (CannotStartContainerError: Error response from dae)`
- ios - Phonegap/Cordova Barcodescanner 在最新的 ios 13 上再次全屏显示
- deployment - 如何将ansible字符串转换为浮点数并使用该值与浮点值进行比较
- git - VSCode:启用或禁用自上次 git 提交后修改的编辑器选项卡,使用修改后的选项卡颜色显示 git 状态
- python-3.x - 如何生成具有多列的数组行的组合?
- typescript - 绝对路径导入的 JS Cloud 函数错误
- html - 自动完成“打开”在 ReactJs 表单中不起作用