【问题标题】:Cross Thread invoke from class ? Confused - vb.net从类中调用跨线程?困惑-vb.net
【发布时间】:2012-01-24 20:56:03
【问题描述】:

也许我被弯了...但事实是我在线程方面有点n00b...

我在课堂上使用串行端口。我正在从那个班级向我的班级提出一个事件。事件包含接收到的数据...

我希望从引发的事件中简单地填充一个文本框。

现在我并没有专门创建一个单独的线程,但是当我尝试在 UI 上更新我的文本框时,我得到了正常的交叉线程错误,所以我的假设是串行端口及其内部方法可能会创建自己的线程......

不管怎样,我对如何从我的主窗体正确实现一个调用,指向实例化类中的线程有点困惑......

我希望这是有道理的......

Dim WithEvents tmpRS232 As New clsRS232

Private Sub but_txt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles but_txt.Click
    tmpRS232.Set_com_port("COM8", 38400)
    tmpRS232.Transmit_data(txt_tx.Text)
End Sub

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
    txt_rx.Text = str_data 'Cross threading error
    MsgBox(str_data) 'Fires without errors
End Sub

有人可以提供基于此代码的代码示例吗?

谢谢。

【问题讨论】:

  • 你不能从非 UI 线程修改 UI [如何在 C# 中从另一个线程更新 GUI][1] [1]:stackoverflow.com/questions/661561/…
  • 是的,我知道...只是不确定在这种情况下“如何”调用...

标签: vb.net multithreading serial-port invoke


【解决方案1】:

您是对的,这里的问题是您试图从非 UI 线程(在本例中为串行端口处理程序)更新 UI 元素。您需要做的是检查是否在您尝试从回调访问的控件上设置了 InvokeRequired 标志。如果是这样,这意味着您需要编组对 UI 线程的调用。您可以使用来自System.Windows.Forms.Control 的 Invoke 或 BeginInvoke 来实现此目的。

Private Delegate Sub SetRxTextCallback(ByVal [text] As String)

Private Sub SetRxText(ByVal [text] As String)
    txt_rx.Text = [text]
End Sub

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned

    If (txt_rx.InvokeRequired) Then
        Dim d As New SetRxTextCallback(AddressOf Me.SetRxText)
        Me.BeginInvoke(d, New Object() {[str_data]})
    End If

    'txt_rx.Text = str_data 'Cross threading error
    'MsgBox(str_data) 'Fires without errors
End Sub

这是一个指向MSDN 文档的链接,其中详细解释了它。

【讨论】:

  • 这就是我要找的兄弟...感谢堆栈..(双关语:-))
【解决方案2】:

或者干脆……

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
    If InvokeRequired Then
        Invoke(Sub()txt_rx.Text = str_data)
    Else
        txt_rx.Text = str_data
    End If
End Sub

【讨论】:

  • 这个答案实际上并没有向用户解释任何事情,你没有解释为什么Invoke(...)是必需的。
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多