Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 函数上的委托,该函数在其他线程中返回值_.net_Vb.net_Delegates - Fatal编程技术网

.net 函数上的委托,该函数在其他线程中返回值

.net 函数上的委托,该函数在其他线程中返回值,.net,vb.net,delegates,.net,Vb.net,Delegates,我相信这是一个简单的问题。我从串口读取了一些数据,在某个解析点,我需要更新一些statuslabel。令人惊讶的是,statuslabel是线程安全的。。。我不知道 好的,但是statuslabel需要包含一些组合文本,这些文本看起来不是线程安全的 statLabel1.Text=“已连接到”&cmbPort.Text&”,已找到并满意” 所以我尝试创建一个函数来“安全读取”任何组件。文本,但我失败了 Private Delegate Function ControlGetTextDelegat

我相信这是一个简单的问题。我从串口读取了一些数据,在某个解析点,我需要更新一些statuslabel。令人惊讶的是,statuslabel是线程安全的。。。我不知道

好的,但是statuslabel需要包含一些组合文本,这些文本看起来不是线程安全的

statLabel1.Text=“已连接到”&cmbPort.Text&”,已找到并满意”

所以我尝试创建一个函数来“安全读取”任何组件。文本,但我失败了

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另一种解决方案是调用check
invokererequired
,然后在实际事件处理程序上调用
BeginInvoke
,而不是调用此函数。然后在UI线程上运行所有事件处理程序代码。有很多这样做的例子(可能大部分是c#)。