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

Я делаю это:

    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. Если я попытаюсь установить его в обычном режиме, он выдаст мне предупреждение о потокобезопасности и не сработает. Если я принудительно вызову, то он говорит, что элемент управления не создан?

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


person meow    schedule 28.06.2011    source источник


Ответы (1)


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

Public Sub SetTextBoxText_ThreadSafe(ByVal Label As TextBox, ByVal text As String)
    If Label.Created Then
        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 If
End Sub

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

person Ry-♦    schedule 28.06.2011
comment
Я использую редактор форм Windows и знаю, что текстовое поле есть: l Текстовое поле существует. - person meow; 28.06.2011
comment
@meow: Да, он может существовать, но, возможно, еще не создан. Когда вы начнете второй поток? - person Ry-♦; 28.06.2011
comment
@meow: Хорошо, есть проблема. Форма еще не создана. Я добавил пример в свой пост. - person Ry-♦; 28.06.2011
comment
Ах. Как мне это сделать тогда? Я впервые работаю с несколькими потоками :( - person meow; 28.06.2011
comment
Эм, нет, я не знаю, как по-настоящему создать форму - person meow; 28.06.2011
comment
@meow: Просто исправьте свой метод SetTextBoxText_ThreadSafe, чтобы отразить то, что я написал в своем ответе (см. редактирование), и он должен работать. Если вы не обновляете TextBox только один раз? В этом случае быстрым решением будет поместить ваш код в Form.Shown вместо Form.Load. - person Ry-♦; 28.06.2011
comment
Он всегда говорит, что TextBox не загружен, поэтому он его не устанавливает. - person meow; 28.06.2011