VB用参数调用跨线程方法调用

时间:2016-11-06 19:22:57

标签: vb.net multithreading winforms delegates

我正在编写一个VB表单应用程序,它重定向进程的标准输出流并在UI中使用它。

我在调用带有参数的方法时遇到问题,这些参数更新了OutputHandler子窗体上的控件。

我可以调用没有参数的方法

Me.Invoke(New MyDelSub(AddressOf ServerStarted))

哪种方法正常。

一些谷歌搜索告诉我,要调用带参数的方法,我应该这样做:

Dim del As JoinDelegate = AddressOf PlayerJoins
del.Invoke(username)

使用此委托和方法对:

Private Delegate Sub JoinDelegate(ByVal username As String)
Private Sub PlayerJoins(ByVal username As String)
   PlayersBox.Items.Add(username)
   'Do other stuff
End Sub

但是,当方法第一次尝试访问控件时,会产生IllegalOperationException。

2 个答案:

答案 0 :(得分:2)

1)假设您有这样的方法:

Public Sub DoSomething(value1 As String, value2 As String)
    MessageBox.Show(String.Format("{0} {1}", value1, value2))
End Sub

您可以使用以这种方式调用来调用它:

Me.Invoke(Sub() DoSomething("Hello", "World!"))

2)如果要对控件进行线程安全调用,可以这样编写方法:

Public Sub AddItemToListBox1(item As String)
    If (ListBox1.InvokeRequired) Then
        ListBox1.Invoke(Sub() AddItemToListBox1(item))
    Else
        ListBox1.Items.Add(item)
    End If
End Sub

然后它就足以在UI线程或其他线程中以相同的方式调用它:

AddItemToListBox1("some item")

调用是线程安全的。

答案 1 :(得分:0)

E.g。

Private Sub SetControlText(control As Control, text As String)
    If control.InvokeRequired Then
        control.Invoke(New Func(Of Control, String)(AddressOf SetControlText), control, text)
    Else
        control.Text = text
    End If
End Sub

从任何线程调用该方法。