在我的应用程序中,某种形式是实例化的,我不知道为什么会发生这种情况。
我想问一下是否有可能检测到加载/实例化表格的“来电者”。
是否有可能从这里获得它?
Public Sub New()
InitializeComponent()
或者还有其他方法可以做到这一点吗?
答案 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