我有以下的测试代码。 它没有任何用处,但它的存在,我听不懂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
该表格包含一个的Button
和Label
。
只是为了学习的目的,我已经把改变在另一个线程在标签的文本方法。 然而, InvokeRequired
值保持返回False
。 这怎么可能? 该Label1
是在主线程创建的,它是在runThread进行调整,因此InvokeRequired
应该给真。
在这里我看到这种情况的发生,当窗体的手柄,使我改变了我尚未创建Run
方式:
Public Sub Run()
Sandbox.Show()
runToggle(1000)
End Sub
这并不解决问题。