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