首先,谢谢,如果我的英语不好,请原谅我。 我尝试了很多方法来实现IDisposable接口。根据我从网上获得的图片我实现了界面。在我的测试项目中,我尝试了很多,所以如果我将一些图像加载到内存中我可以看到IDisposible按照我的期望工作。要查看内存(PF使用)我使用任务管理器。这里“test.bmp”是5mb文件
这是我做过的三个实验
Dim i As Integer = 0
While (i < 1000)
i = i + 1
Dim bmp As New Bitmap("D:\test.bmp")
End While
它扼杀了我的记忆。然后我试了
Dim i As Integer = 0
While (i < 1000)
i = i + 1
Using bmp As New Bitmap("D:\test.bmp")
End Using
End While
PF稳定到1000.意味着记忆释放了。
然后我试了 Dim i As Integer = 0
Dim dt As DateTime = DateTime.Now
While (i < 1000)
i = i + 1
Using oTestDispose As New clsTestDispose
End Using
End While
Public Class clsTestDispose
Implements IDisposable
Dim bmp As New Bitmap("D:\test.bmp")
Private disposedValue As Boolean = False ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: free unmanaged resources when explicitly called
Me.Dispose()
End If
' TODO: free shared unmanaged resources
End If
Me.disposedValue = True
End Sub
#Region " IDisposable Support "
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
此代码告诉“System.StackOverFlowException”。为什么dispose没有清除里面的图像对象?
答案 0 :(得分:2)
因为您要覆盖Dispose
方法并在Me.Dispose
内再次调用它,所以此方法以递归方式运行。
您可以使用“MyBase:
”调用Dispose
MyBase.Dispose()
这将调用派生类上的Dispose
,阻止它循环并以StackOverflowException
结束。