如何处置所有隐藏的表格?

时间:2013-12-13 01:29:27

标签: .net vb.net winforms

我的应用程序内存负载有问题。
由于每次我想查看某些内容时都使用Dim f As New Form2,因此会增加负载。虽然我无法关闭它,因为我将无法再次使用该表格,而是将其隐藏起来 但我没有打电话给我隐藏的f,而是创建另一个f ..

不时..如果我打开,关闭,再打开,那些f将会出现在24/7应用程序的记忆中,这可能是我说的很重的负载。 / p>

我已经阅读了垃圾收集并做了一些测试,我认为帮助,我想。

这是我在任务管理器中的应用程序的数学运算:

Mainform - 30mb - >然后
Dim f As New Form2Hide() 20 f - 它变成了 - > 57MB
5分钟后 - 50mb
这就是我认为 GC发生的地方..或者我错了。

它是关于它解释当前的问题..
那么,我有一个选项,如..

dim forms = application.hidden.ofType(form2)
'close em'

'teach me some workaround, that would be great :)

或者没有选择,但

'do nothing.. :/

1 个答案:

答案 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