避免了交叉线程异常,但GUI未更新

时间:2013-04-24 11:24:15

标签: vb.net multithreading thread-safety backgroundworker

我有一个需要更新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

1 个答案:

答案 0 :(得分:1)

尝试这样

    Label1.CustomInvoke(Sub() Label1.Text = "hello")