代码之家  ›  专栏  ›  技术社区  ›  darda

从.NET中的其他线程更改UI元素

  •  2
  • darda  · 技术社区  · 15 年前

    我不明白。如果我想从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 回复  |  直到 15 年前
        1
  •  3
  •   Marc Gravell    15 年前

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

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

    注意我用过 MethodInvoker 这里是故意的-这是由 Invoke ,这意味着它不必使用(非常慢) DynamicInvoke .

    我也可以做 .Text = text 在anon方法中,但这似乎违背了dry。

    推荐文章