gpt4 book ai didi

vb.net - VB窗体跨线程方法调用带参数

转载 作者:行者123 更新时间:2023-12-03 13:17:05 25 4
gpt4 key购买 nike

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

我在从 OutputHandler 子调用带有更新表单控件的参数的方法时遇到问题。

我可以像这样调用一个没有参数的方法

Me.Invoke(New MyDelSub(AddressOf ServerStarted))

效果很好。

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

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

使用这个委托(delegate)和方法对:

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。

最佳答案

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")

调用是线程安全的。

关于vb.net - VB窗体跨线程方法调用带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40453515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com