我知道关于这个主题的问题很少,但我仍未找到对我的问题的真正答案。
我有一个带菜单的MDI表单,当然点击一个菜单项会打开一个表单。
当这个子窗体关闭时,我可以看到没有释放内存(根据任务管理器)。 我知道任务管理器不是很可靠,但它是可靠的,因为如果我一次又一次地打开和关闭表单,应用程序会变慢并且内存使用量会增加。
我在这里找到了一些主题,谈论处理表单并确保表单中没有任何对象具有表单外部其他对象的句柄。 在详细信息中,我发现了这个问题和答案:Unregistering all events to release memory
引发事件的对象使处理事件的对象保持活动状态。
所以这可能是我的情况,但我想知道是否有某种方法可以找出whitch是另一个让对象保持活力的对象。 有没有办法获得这些对象的列表?有人可以提供几行代码和/或更清楚吗? 感谢
编辑:一些代码
这是包含菜单并作为MDI容器使用的主窗体。
Partial Public Class FrmMain
Inherits Telerik.WinControls.UI.RadForm
Public Sub New()
InitializeComponent()
.IsMdiContainer = True
createMainMenu()
End Sub
Private Sub createMainMenu()
radMenu1.Items.Clear()
' First MenuItem
item = New RadMenuItem
item.Text = reader.Value
item.Name = "Registration"
item.Tag = actualIndex
item.Visibility = ItemVisibility
AddHandler item.Click, AddressOf MenuItemClicked
radMenu1.Items.Add(item)
End Sub
Private Sub MenuItemClicked(sender As Object, e As EventArgs)
Select Case sender.Name
Case "Registration"
Cursor = Cursors.WaitCursor
Dim frmRegistration As New FrmRegistration
frmRegistration.MdiParent = Me
frmRegistration.Show()
Cursor = Cursors.Default
End Select
End Sub
End Class
这是主表单菜单打开的表单代码
Public Class FrmRegistration
Public MainForm As FrmMain
Private myParent As Docking.HostWindow
Public dbContext As New My_DataEntities
Private Sub FrmRegistration_Load(sender As Object, e As EventArgs) Handles Me.Load
loadQueries() ' A lot of entity framework queries and loads
' some FrmRegistration's controls handlers
End Sub
Private Sub CommandBarButtonExit_Click(sender As Object, e As EventArgs) Handles CommandBarButtonExit.Click
Me.Close()
End Sub
Private Sub FrmRegistration_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
If Not dbContext Is Nothing Then dbContext.Dispose()
dbContext = Nothing
End Sub
End Class
加载实体使用大约80MB的内存,当我关闭此表单时,看起来这个数量不会被释放。每次打开此表单时,加载过程都会增加大约80MB,在几个打开/关闭周期后似乎是内存泄漏。