当期望为true时,InvokeRequired保持返回false

时间:2012-05-24 08:22:15

标签: vb.net multithreading invokerequired

我有以下测试代码。它没有任何用处,但它让我理解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

表单由ButtonLabel组成。

出于学习目的,我已经将方法更改为另一个线程中标签中的文本。但是,InvokeRequired值会一直返回False。这怎么可能? Label1在主线程中创建,并在runThread中进行调整,因此InvokeRequired应该为True。

Here我读到,当表单的句柄尚未创建时,会发生这种情况,所以我更改了Run方法:

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

这不能解决问题。

1 个答案:

答案 0 :(得分:3)

根据Control.InvokeRequired Property

如果控件的句柄尚不存在,InvokeRequired将向上搜索控件的父链,直到找到具有窗口句柄的控件或表单。如果找不到合适的句柄,InvokeRequired方法将返回 false