【问题标题】:How to use IDisposable Interface(not disposing inner objects)如何使用 IDisposable 接口(不处理内部对象)
【发布时间】:2014-05-14 13:47:10
【问题描述】:

首先谢谢,如果我的英语不好,请原谅我。 我尝试了很多方法来实现 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 没有清除其中的图像对象?

【问题讨论】:

    标签: vb.net idisposable


    【解决方案1】:

    因为您要覆盖Dispose 方法并在内部使用Me.Dispose 再次调用它,所以此方法递归运行。

    您可以使用 `MyBase: 调用 Dispose

    MyBase.Dispose()
    

    这将在派生类上调用Dispose,防止它循环并以StackOverflowException 结束。

    【讨论】:

    • 嗨,非常感谢帕特里克。我将此标记为我的问题的答案。但是我的实际问题仍然没有解决。当我评论调用 dispose() 方法时。它正在扼杀我的记忆并制造“内存不足异常”。我怎样才能更正确地清理内存?换句话说,在真正的编码中,很多对象会在对象内部生成。如果容器对象处理我如何清除内部对象?
    • Microsoft 在生成的代码中执行此操作,方法是保留一个活动控件列表,并在使用后对它们调用 Dispose。如果相关,控件本身应将其转发给他们的孩子。您的第二个样本是最准确的样本,应该可以正常工作(这就是它的本意)。
    • 非常感谢您让我清楚地了解这个概念。因此,即使也使用 dispose,我也需要手动释放所有内存。在 dispose 方法中需要清理每个对象的逻辑。对吗?所以 dispose 除了标准化之外没有任何魔力。我说的对吗?
    • 确实如此。例如,如果您有一个控件,您可以依靠Form 来正确处理它。如果控件中有变量位图,则必须“自己”将其放置在控件的Dispose 中。
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多