2012-11-30 28 views
0

我相信这是一个简单的问题。我从串口读取一些数据,并在一些解析点上,我需要更新一些状态标签。出人意料的是,statuslabel是线程安全的......我不知道......代表函数返回其他线程中的值

好,但statuslabel需要包括似乎不是线程安全的一些组合文本

statLabel1.Text =“连接到” & cmbPort.text &“发现快乐”

于是,我就做一个函数从任何component.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 

能有人给一点点帮帮我?

回答

0

我认为你的问题是,你不是在的s上任何东西。

您可以将结果分配给s(您需要使Invoke而不是BeginInvoke),但最好调用您调用此事件的事件处理函数。您没有发布该代码,但它基本上是相同的想法 - 在表单上测试InvokeRequired,然后为事件处理程序本身调用BeginInvoke

+0

你摇滚:)非常感谢。我改为s = cmp.Invoke(dlg,{cmp}),并且像魅力一样工作。事实上,我试过,但BeginInvoke不允许返回我的价值。 – user1797147

+0

你能解释一下吗? – user1797147

+0

'BeginInvoke'是异步的,所以它返回'IAsyncResult'。在你的例子中你想要'调用'。或者在事件处理程序中使用'BeginInvoke'。 –