1
我有一个需要更新Windows窗体的线程。从这里使用代码:避免了跨线程异常,但GUI不更新
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