找出表单实例化的原因

时间:2017-08-29 20:34:05

标签: vb.net forms winforms visual-studio-2017

在我的应用程序中,某种形式是实例化的,我不知道为什么会发生这种情况。

我想问一下是否有可能检测到加载/实例化表格的“来电者”。

是否有可能从这里获得它?

Public Sub New()

    InitializeComponent()

或者还有其他方法可以做到这一点吗?

编辑: 这是callstack: enter image description here

1 个答案:

答案 0 :(得分:2)

此处的问题是由于您从后台主题访问frmMain的{​​{3}}。

VB.NET包含每个表单的默认实例,因此每次要打开新表单时都不必执行Dim ... As New myForm。这种行为可以让你缩短:

Dim mainForm As New frmMain
mainForm.Show()

为:

frmMain.Show()

虽然没有具体记录,但是从以前进行我自己的测试看来,默认实例似乎特定于当前线程 。因此,如果您尝试从后台线程访问默认表单实例 ,它将为特定线程创建一个新实例,因此不会与你在UI线程上使用的那个。

最后,这给我们带来了WinForms的黄金规则之一,LarsTech提到:在(G)UI线程上保留所有(G)UI相关工作

如果您确实需要从后台线程访问第一个frmMain实例,则应该创建一个返回该特定实例的Shared属性:

Private Shared _instance As frmMain = Nothing

Public Shared ReadOnly Property MainInstance As frmMain
    Get
        Return _instance
    End Get
End Property

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If frmMain._instance Is Nothing Then frmMain._instance = Me 'Setting the main instance if none exists.
End Sub

然后从后台线程中你可以做到:

frmMain.MainInstance.DoSomething