我的应用程序内存负载有问题。
由于每次我想查看某些内容时都使用Dim f As New Form2
,因此会增加负载。虽然我无法关闭它,因为我将无法再次使用该表格,而是将其隐藏起来
但我没有打电话给我隐藏的f
,而是创建另一个f
..
不时..如果我打开,关闭,再打开,那些f
将会出现在24/7应用程序的记忆中,这可能是我说的很重的负载。 / p>
我已经阅读了垃圾收集并做了一些测试,我认为帮助,我想。
这是我在任务管理器中的应用程序的数学运算:
Mainform - 30mb - >然后
我Dim f As New Form2
和Hide()
20 f
- 它变成了 - > 57MB
5分钟后 - 50mb
这就是我认为 GC发生的地方..或者我错了。
它是关于它解释当前的问题..
那么,我有一个选项,如..
dim forms = application.hidden.ofType(form2)
'close em'
或
'teach me some workaround, that would be great :)
或者没有选择,但
'do nothing.. :/
答案 0 :(得分:1)
修改强>
如果您不想将代码重组为适当的类,那么创建表单实例的东西必须能够找到它创建的表单/凸轮,以便它可以关闭它们。为此,它需要a)标识符,b)存储机制和c)知道用户正在关闭表单的方法 - 你至少缺少其中2个。
a)标识符
当mainform创建表单实例时,向构造函数添加一些内容,如名称或标记。这必须是用户无法改变的。这使用GUID:
MainForm,可能是点击事件:
Dim CamID As String = System.Guid.NewGuid.ToString
Dim f as New Form2(CamID)
' more to come in a moment
窗体2:
Public CamGuid As String = ""
' modify **existing** Sub New adding a param
Public Sub New(myCamID As String)
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
CamGuid = myCamID
End Sub
现在mainform和camform都有一个共同的唯一标识符!
b)存储
Mainform需要能够找到f
才能正确关闭它:
Private _cameras As New Dictionary(of String, Form2)
在同一个点击事件中,保存刚刚创建的表单参考:
Dim CamID As String = System.Guid.NewGuid.ToString
Dim f as New Form2(CamID)
' save form ref using CamID as a key
_cameras.Add(CamID, f)
c)结束通知: 在form2 clos * ING * event:
Me.Hide
' tell main form we are closing, identify which one using the camera GUID
MainForm.CameraClosed(CamGuid)
注意:在CLOSE中放置正常的关闭代码(如清理和查杀摄像头) - 我们需要一种正常运行的方法。因此,将HIDE和Call调用到FormClosing中的MainForm。
以主要形式:
Public Sub CameraClosed(cameraID As String)
if _cameras.ContainsKey(cameraID) Then
' doing it the long way...fetch the form ref
Dim f As Form2 = _cameras(CameraID)
' remove from dictionary of active forms
_cameras.Remove(cameraID)
f.Close ' let normal CLOSE code run
f = Nothing
End if
End Sub