我有以下测试代码。它没有任何用处,但它让我理解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
应该为True。
Here我读到,当表单的句柄尚未创建时,会发生这种情况,所以我更改了Run
方法:
Public Sub Run()
Sandbox.Show()
runToggle(1000)
End Sub
这不能解决问题。
答案 0 :(得分:3)
根据Control.InvokeRequired Property
如果控件的句柄尚不存在,InvokeRequired将向上搜索控件的父链,直到找到具有窗口句柄的控件或表单。如果找不到合适的句柄,InvokeRequired方法将返回 false 。