InvokeRequired keeps returning false when true is

2019-07-21 14:30发布

I have the following test code. It does nothing useful, but it's there for me to understand VB:

Imports System
Imports System.IO
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports System.Threading

Public Class Sandbox
    Public Shared num As NumericUpDown

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim objWrk As Worker
        objWrk = New Worker
        objWrk.Show()
    End Sub
End Class

Public Class Worker
    Public Sub Show()
        Dim runThread As New System.Threading.Thread(AddressOf Run)      ' Call the runner in a seperate thread
        runThread.Start()
    End Sub

    Public Sub Run()
        runToggle(1000)
    End Sub

    Public Delegate Sub runToggleInvoker(ByVal value As Integer)
    Public Sub runToggle(ByVal value As Integer)
        If Sandbox.Label1.InvokeRequired = True Then
            Sandbox.Label1.Invoke(New runToggleInvoker(AddressOf runToggle), value)
        Else
            Sandbox.Label1.Text = value
        End If
    End Sub
End Class

The form consists of a Button and a Label.

Just for learning purposes I've put the method to change the text in the label in another thread. However the InvokeRequired value keeps returning False. How is this possible? The Label1is created in the main thread, and it is being adjusted in the runThread hence InvokeRequired should give True.

Here I read that this happens when the handle for the form is not created yet so I changed my Run method:

Public Sub Run()
            Sandbox.Show()
            runToggle(1000)
        End Sub

This does not solve the problem.

1条回答
闹够了就滚
2楼-- · 2019-07-21 14:56

According to Control.InvokeRequired Property

If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. If no appropriate handle can be found, the InvokeRequired method returns false.

查看更多
登录 后发表回答