2

我正在编写一个名为 Field 的类,它使用串行对象从 Arduino 获取一些值。我有一个由类引发的事件(当从串行端口接收到数据时,或多或少),当发生这种情况时,我需要从这个类中检索数据。下面的代码有效,但似乎没有按照我需要的方式这样做。我对线程如何工作的了解很少,我只知道串行端口对象在它自己的线程中运行,这使得使用它变得非常痛苦。

Private Sub Field_eScore() Handles Field.eScore

    If InvokeRequired Then
        Invoke(Sub() lbl_COM_data.Text = Field.GetComData())
    Else
        lbl_COM_data.Text = Field.GetComData()
    End If

End Sub

有没有一种方法可以轻松访问在另一个线程中运行的数据,而不涉及这些“InvokeRequired”If-Then 条件?有关在这种情况下线程如何工作的更多信息也很棒。

4

1 回答 1

0

InvokeRequired是必需的,因为 UI 只能由创建控件的线程(通常是主线程)修改。

为了“避免”它,设计您的代码以分离职责——将 UI 修改与处理串行端口的代码保持在不同的层。

您仍然需要检查是否InvokeRequired在某些地方 - 您确实将后端与 UI 接口 - 但它应该只在一个“层”中。

于 2012-11-04T06:55:22.963 回答