Find out reason for form instancing

后端 未结 1 703
终归单人心
终归单人心 2020-12-07 06:03

In my application, a certain form is instanciated, and I have no idea why this happens.

I would therefore like to ask if it\'s possible to detect the \"caller\" that

相关标签:
1条回答
  • 2020-12-07 06:41

    The issue here was due to that you were accessing frmMain's default instance from a background thread.

    VB.NET includes default instances of every form so that you don't have to do a Dim ... As New myForm every time you want to open a new form. This behaviour will let you shorten:

    Dim mainForm As New frmMain
    mainForm.Show()
    

    to:

    frmMain.Show()
    

    And although not specifically documented, from previously conducting my own test it appears that the default instance is specific to the current thread only. Thus if you try to access the default form instance in any way from a background thread it will create a new instance for that specific thread, and therefore not be the same as the one you're using on the UI thread.

    In the end this brings us to one of the golden rules of WinForms, which LarsTech mentioned: Leave all (G)UI related work on the (G)UI thread!


    If you really need to access your first instance of frmMain from a background thread you should make a Shared property that returns that specific instance:

    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
    

    Then from a background thread you'll be able to do:

    frmMain.MainInstance.DoSomething
    
    0 讨论(0)
提交回复
热议问题