我正在编写一个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。
答案 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
从任何线程调用该方法。