我能';t设置标签';以编程方式创建文本(vb.net)

我能';t设置标签';以编程方式创建文本(vb.net),vb.net,Vb.net,我已经看到了许多解决这个问题的可能方法,但似乎没有一个有效 Try Dim ricevuto As String ricevuto = SerialPort1.ReadExisting If String.Compare(ricevuto.Substring(ricevuto.Length - 3), "OF") = 0 Then Me.Label1.Text = &qu

我已经看到了许多解决这个问题的可能方法,但似乎没有一个有效

Try
            Dim ricevuto As String
            ricevuto = SerialPort1.ReadExisting

            If String.Compare(ricevuto.Substring(ricevuto.Length - 3), "OF") = 0 Then
                Me.Label1.Text = "aperto"
                Me.Label1.Refresh()
            ElseIf String.Compare(ricevuto.Substring(ricevuto.Length - 3), "ON") = 0 Then
                Me.Label1.Text = "chiuso"
                Me.Label1.Update()

            End If




        Catch ex As Exception
        End Try
这是代码,但是标签1没有改变

更新:错误为“跨线程操作无效”

错误为“跨线程操作无效”

当您使用多个线程,并且不再使用UI线程时,您需要
调用
更改:

Label1.Invoke(Sub() Label1.Text = "aperto")
为了展示整个过程:

Dim ricevuto As String=SerialPort1.ReadExisting()
Dim key As String=ricevuto.Substring(ricevuto.Length-3)
如果String.Compare(键“OF”)=0,则
Label1.Invoke(Sub()Label1.Text=“aperto”)
ElseIf String.Compare(key,“ON”)=0然后
Label1.Invoke(Sub()Label1.Text=“chiuso”)
如果结束

没有人提到的一个重要问题是,
SerialPort
类在线程池线程上引发其
DataReceived
事件。这样做是为了使您的UI不会在每次接收数据时都冻结。这就是您首先在辅助线程上执行代码的原因。正如所建议的,您需要封送对UI线程的方法调用以影响UI。我认为可以肯定地说,如果您正确地实施了这些解决方案,您找到的一些或所有解决方案都会起作用。