.net 函数上的委托,该函数在其他线程中返回值
我相信这是一个简单的问题。我从串口读取了一些数据,在某个解析点,我需要更新一些statuslabel。令人惊讶的是,statuslabel是线程安全的。。。我不知道 好的,但是statuslabel需要包含一些组合文本,这些文本看起来不是线程安全的 statLabel1.Text=“已连接到”&cmbPort.Text&”,已找到并满意” 所以我尝试创建一个函数来“安全读取”任何组件。文本,但我失败了.net 函数上的委托,该函数在其他线程中返回值,.net,vb.net,delegates,.net,Vb.net,Delegates,我相信这是一个简单的问题。我从串口读取了一些数据,在某个解析点,我需要更新一些statuslabel。令人惊讶的是,statuslabel是线程安全的。。。我不知道 好的,但是statuslabel需要包含一些组合文本,这些文本看起来不是线程安全的 statLabel1.Text=“已连接到”&cmbPort.Text&”,已找到并满意” 所以我尝试创建一个函数来“安全读取”任何组件。文本,但我失败了 Private Delegate Function ControlGetTextDelegat
Private Delegate Function ControlGetTextDelegate(ByRef cmp As Control) As String
Public Function ControlGetText(ByRef cmp As Control) As String
Dim s As String = ""
' control invoked from another thread ?
If cmp.InvokeRequired Then ' YES, so call through delegate
Dim dlg As New ControlGetTextDelegate(AddressOf ControlGetText)
cmp.BeginInvoke(dlg, {cmp})
Else ' NO, so call normally
s = cmp.Text
End If
Return s
End Function
有人能帮点忙吗?我想你的问题是,当
invokererequired=True
时,你没有向s
提供任何帮助
您可以将结果分配给
s
(您需要调用而不是BeginInvoke
),但最好调用从中调用的事件处理程序。您没有发布该代码,但基本上是相同的想法——在表单上测试invokererequired
,然后为事件处理程序本身调用BeginInvoke
。You rock:)非常感谢。我改为s=cmp.Invoke(dlg,{cmp}),工作起来很有魅力。事实上,我试过了,但是BeginInvoke不允许返回我的值。你能用更好的解决方案解释一下你说的吗?BeginInvoke
是异步的,所以它返回一个IAsyncResult
。在您的示例中,您希望调用。或者在事件处理程序上使用BeginInvoke
。@user1797147另一种解决方案是调用checkinvokererequired
,然后在实际事件处理程序上调用BeginInvoke
,而不是调用此函数。然后在UI线程上运行所有事件处理程序代码。有很多这样做的例子(可能大部分是c#)。