Изменение элементов пользовательского интерфейса из другого потока в .NET - PullRequest
2 голосов
/ 17 декабря 2009

Я не понимаю. Если я хочу изменить текст на кнопке из потока, отличного от потока пользовательского интерфейса в Visual Basic .NET, мне нужно использовать делегат и сделать что-то вроде

 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 Ответ

3 голосов
/ 17 декабря 2009

В C # анонимные методы очень полезны; возможно есть что-то подобное в VB? (мой VB-фу слаб). Вы также можете повторно использовать текущий метод вместо двух; как пример:

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

Обратите внимание, что я использовал MethodInvoker здесь намеренно - это обрабатывается как особый случай Invoke, то есть не нужно использовать (очень медленно) DynamicInvoke.

Я мог бы также сделать .Text = text в методе anon, но это, кажется, нарушает DRY.

...