2013-04-24 85 views
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

回答