从.NET中的另一个线程更改UI元素

时间:2009-12-17 03:50:45

标签: .net vb.net multithreading user-interface delegates

我不明白。如果我想从Visual Basic .NET中的UI线程以外的线程更改按钮上的文本,我需要使用委托,并按照

的方式执行某些操作
 Private Delegate Sub SetTextDelegate(ByVal TheText As String)
 Private Sub delSetText(ByVal TheText As String)
     Button1.Text = TheText
 End Sub

 Private Sub ChangeText(ByVal TheText As String)
     If Button1.InvokeRequired Then
         Me.BeginInvoke(New SetTextDelegate(AddressOf delSetText), TheText)
     Else
         delSetText(TheText)
     End If
 End Sub

当然,我可以制作更多不那么硬连线的通用功能。但是,它似乎很多打字。我是以迂回的方式做这件事的吗?这怎么不包含在控件属性中---如果需要,为什么有人会把这个留给程序员?

1 个答案:

答案 0 :(得分:3)

在C#中,匿名方法在这里非常有用;也许在VB中有类似的东西? (我的VB-fu很弱)。您也可以重复使用当前方法而不是两个;举个例子:

void ChangeText(string text) {
    if(InvokeRequired) {
        this.Invoke((MethodInvoker) delegate {ChangeText(text);});
    } else {
        Button1.Text = text;
    }
}

请注意,我在这里故意使用了MethodInvoker - 这是Invoke的特殊情况,这意味着它不必使用(非常慢)DynamicInvoke

我也可以在anon方法中完成.Text = text,但这似乎违反了DRY。