我有一个线程需要更新 Windows 窗体。使用此处的代码:
http://www.dreamincode.net/forums/blog/143/entry-2337-handling-the-dreaded-cross-thread-exception/
以避免跨线程异常。
我已经更新了控件,但 GUI 没有刷新以显示新值。为了确认它们正在更新,我正在读取它们的值,设置它们然后再次读取它们,并在两种情况下打印出结果。
这是我的代码(包含在线程库中),用于添加一个自定义事件,我可以使用它来触发对任何控件的线程安全更新:
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Public Module MyInvoke
<Extension()>
Public Sub CustomInvoke(Of T As ISynchronizeInvoke)(ByVal control As T, ByVal toPerform As Action(Of T))
If control.InvokeRequired Then
control.Invoke(toPerform, New Object() {control})
Else
toPerform(control)
End If
End Sub
End Module
当线程强制更新时,它是这样做的:
' Read initial label text and write it out
Dim labelText As String = Form1.Label1.Text
Console.WriteLine("Label: " & labelText)
' Change value of label text, re-read it and write it out
Form1.Label1.CustomInvoke(Sub(l) l.Text = "Hello World")
labelText = Form1.Label1.Text
Console.WriteLine("Label: " & labelText)
此代码更改文本,但不会在 GUI 中更新 - 它仍显示为“Label1”。如果我再次触发线程,它会正确读取更改的值(Hello World),但它仍未在 GUI 中更新(仍显示 Label1)。
我试过刷新它: Form1.Label1.CustomInvoke(Sub(l) l.Refresh()) 没有成功。我究竟做错了什么 ?
TIA