.net 如何处理所有隐藏的表单?

.net 如何处理所有隐藏的表单?,.net,vb.net,winforms,.net,Vb.net,Winforms,我的应用程序内存加载有问题。 由于每次我想查看某个内容时,它都使用Dim f作为新的Form2,因此它会增加负载。虽然我无法关闭它,因为我将无法再次使用该表单,但我将其隐藏。 但是我没有调用我隐藏的f,而是创建了另一个f 不时地。。如果我打开,再关闭,再打开,那些f,将在一个24/7应用程序的内存中,我可以说这是一个非常沉重的负载 我读过关于垃圾收集的书并做了一些测试,我想这会有所帮助 以下是任务管理器中我的应用程序的数学: Mainform--30mb-->然后 IDim f作为新表单2和Hi

我的应用程序内存加载有问题。
由于每次我想查看某个内容时,它都使用
Dim f作为新的Form2
,因此它会增加负载。虽然我无法关闭它,因为我将无法再次使用该表单,但我将其隐藏。
但是我没有调用我隐藏的
f
,而是创建了另一个
f

不时地。。如果我打开,再关闭,再打开,那些
f
,将在一个24/7应用程序的内存中,我可以说这是一个非常沉重的负载

我读过关于垃圾收集的书并做了一些测试,我想这会有所帮助

以下是任务管理器中我的应用程序的数学:

Mainform--30mb-->然后
I
Dim f作为新表单2
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.. :/
编辑

如果您不想将代码重组为适当的类,那么创建表单实例的东西必须能够找到它创建的表单/cam,以便能够关闭它们。要做到这一点,它需要a)一个标识符,b)一个存储机制和c)一种知道用户正在关闭表单的方法-您至少缺少其中的两个

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) 储藏

主窗体需要能够找到
f
以正确关闭它:

  Private _cameras As New Dictionary(of String, Form2)
在同一个单击事件中,保存刚刚创建的表单ref:

  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*事件中:

注意:将正常的关闭代码(如清理和关闭摄像头提要)置于关闭状态-我们需要一种方法使其正常运行。因此,在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

为什么不能关闭窗体而不是隐藏它们?隐藏表单后,您对表单做了什么?如果我处理了表单2,我将无法使用它,那么所有隐藏的表单都是垃圾。您是否对这些表单使用
.Show()
.ShowDialog()
。。我不能使用modals,因为我需要它们,因为我控制
Form1
,尽管
Form2.Owner=Form1
表单与摄像机有什么关系?camera类真的是一个表单吗?如果我使用mainForm之外的类,我将重新编码所有这些。另外,我对这种类型不太熟悉。我可以在form2的闭幕式上使用
f=Nothing
吗?不管怎样,我检查了您为我回答的问题。我现在有我的密码了。从数据库的
Form_Load
my app现在几乎可以部署了,但唯一的问题是它将处理大量的负载,因为这可能是全天候开放的。。我是否可以在代码中添加
最后
block
f=Nothing
?如果Form2代码知道实例变量(
f
),我怀疑这是问题的一部分-不应该。在Form2 Close中,除了保存cam设置或关闭进纸可能需要执行的操作外,不要执行任何操作。如果他们为Cam3点击“X”,让该表单自行消亡,GC将自行清理。这个构造的问题是,无论创建它的是什么(mainform?),现在都不再知道表单实例是无效的!作为黑客,您可以为每个
f
添加代码,告诉Mainform
MallCam
正在关闭,这样它就知道
f
已经死了。@AdorableVB更改了答案,以反映Mainform知道谁正在关闭然后正确关闭它们的机制我们(您)不希望在用户单击“关闭”时关闭表单-我们希望让MainForm关闭并处理它。因此,在CameraForm的FormClosing事件中(而不是FormClosing,太晚了),隐藏并告诉主窗体关闭它。由于MainForm创建了表单,他会进行清理,包括删除相机/表单的条目和表单引用。最后一步是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