JHa*_*all 1 vb.net multithreading delegates winforms
我正在编写一个 VB 表单应用程序,它重定向进程的标准输出流并在 UI 中使用它。
我在调用带有参数的方法时遇到了问题,这些参数会从 OutputHandler 子程序更新表单上的控件。
我可以像这样调用一个没有参数的方法
Me.Invoke(New MyDelSub(AddressOf ServerStarted))
Run Code Online (Sandbox Code Playgroud)
哪个工作正常。
一些谷歌搜索告诉我,要调用带参数的方法,我应该这样做:
Dim del As JoinDelegate = AddressOf PlayerJoins
del.Invoke(username)
Run Code Online (Sandbox Code Playgroud)
使用这个委托和方法对:
Private Delegate Sub JoinDelegate(ByVal username As String)
Private Sub PlayerJoins(ByVal username As String)
PlayersBox.Items.Add(username)
'Do other stuff
End Sub
Run Code Online (Sandbox Code Playgroud)
但是这会在该方法第一次尝试访问控件时产生 IllegalOperationException。
1)假设你有一个这样的方法:
Public Sub DoSomething(value1 As String, value2 As String)
MessageBox.Show(String.Format("{0} {1}", value1, value2))
End Sub
Run Code Online (Sandbox Code Playgroud)
您可以使用 invoke 这种方式调用它:
Me.Invoke(Sub() DoSomething("Hello", "World!"))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然后在 UI 线程或另一个线程中以相同的方式简单地调用它就足够了:
AddItemToListBox1("some item")
Run Code Online (Sandbox Code Playgroud)
该调用将是线程安全的。
| 归档时间: |
|
| 查看次数: |
4373 次 |
| 最近记录: |