Invoke не будет вызывать? - PullRequest
       14

Invoke не будет вызывать?

0 голосов
/ 28 июня 2011

Я делаю это:

    Delegate Sub SetTextBoxText_Delegate(ByVal [Label] As TextBox, ByVal [text] As String)
' The delegates subroutine.  

Public Sub SetTextBoxText_ThreadSafe(ByVal [Label] As TextBox, ByVal [text] As String)
    ' InvokeRequired required compares the thread ID of the calling thread to the thread ID of the creating thread.  
    ' If these threads are different, it returns true.  
    If [Label].InvokeRequired Then
        MsgBox("invoke")
        Dim MyDelegate As New SetTextBoxText_Delegate(AddressOf SetTextBoxText_ThreadSafe)
        Me.Invoke(MyDelegate, New Object() {[Label], [text]})
    Else
        MsgBox("noinvoke")
        [Label].Text = [text]
    End If
End Sub

Однако он всегда использует noinvoke. Если я попытаюсь установить его как обычно, он выдаст мне многопоточное предупреждение и не будет работать. Если я принудительно вызываю, то он говорит, что элемент управления не создан?

Может ли кто-нибудь помочь?

1 Ответ

2 голосов
/ 28 июня 2011

Скорее всего, потому что элемент управления еще не был создан при попытке доступа к нему. Подождите, пока элемент управления не загрузится, или проверьте его, используя Label.Created. Вот так:

Public Sub SetTextBoxText_ThreadSafe(ByVal Label As TextBox, ByVal text As String)
    <b>If Label.Created Then</b>
        If Label.InvokeRequired Then
            MsgBox("invoke")
            Dim MyDelegate As New SetTextBoxText_Delegate(AddressOf SetTextBoxText_ThreadSafe)
            Me.Invoke(MyDelegate, New Object() {Label, text})
        Else
            MsgBox("noinvoke")
            Label.Text = text
        End If
    <b>End If</b>
End Sub

P.S. Вам не нужен пользовательский тип делегата, просто используйте Action(Of TextBox, String). Вам также не нужны квадратные скобки вокруг Label или text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...