Vb.net VB-如何从运行在另一个线程(串行对象)上的类访问数据

Vb.net VB-如何从运行在另一个线程(串行对象)上的类访问数据,vb.net,multithreading,serial-port,invokerequired,Vb.net,Multithreading,Serial Port,Invokerequired,我正在编写一个名为Field的类,它使用一个串行对象从Arduino获取一些值。我有一个由类引发的事件(当数据或多或少地从串行端口接收时),当发生这种情况时,我需要从这个类检索数据。下面的代码可以工作,但似乎没有按照我需要的方式工作。我对线程是如何工作的知之甚少,我只知道串行端口对象在它自己的线程中运行,这使得使用它非常痛苦 Private Sub Field_eScore() Handles Field.eScore If InvokeRequired Then In

我正在编写一个名为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

有没有一种方法可以轻松访问在另一个线程中运行的数据,而不需要使用这些“invokererequired”If-Then条件?在这种情况下,关于线程如何工作的更多信息也将非常棒。

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

为了“避免”这种情况,请将代码设计为将责任分开——将UI修改与处理串行端口的代码放在不同的层中


您仍然需要在某些地方检查
invokererequired
,在这些地方您确实可以将后端与UI接口,但它应该只在一个“层”中。答案可能是:这里有一些关于线程的好信息:感谢您的回复,我喜欢关于线程的文档,这是一个很酷的设置。不幸的是,另一个stackoverflow引用不是我想要的。你不应该像那样复制代码。调用可以调用自身。