首页 > 解决方案 > 用于 RS232 应用程序中的 Threading.thread.sleep 的 VB.Net 替代方案

问题描述

我正忙于使用 Rs232 Com 端口通信模块的软件。我首先向所有用户发送一个点名(Ping 所有用户),然后等待 10 分钟以接收所有点名,然后我使用列表视图发送给所有未完成的名称(Ping 未完成的活动个人),其余的成员的名字,我以 3 的间隔发送所有优秀的名字,间隔 3.5 秒。我Threading.Thread.Sleep()用来防止我的中继器泛滥。是否有替代方法Threading.Thread.Sleep()允许软件仍然接收通过 Rs232 模块发送唱名呼叫的点名反馈?

  For i As Integer = 0 To LsvCopyRemove.Items.Count - 1
        If LsvCopyRemove.Items(i).SubItems(11).Text = "Yes" Then
            Dim Group As String = LsvCopyRemove.Items(i).Text
            StringData = vbCrLf & "MY String Information comes here"
            _rs232.Write("" & vbCrLf)
            Threading.Thread.Sleep(500)
            _rs232.Write(StringData & vbCrLf) 'The text contained in the txtText will be sent to the serial port as ascii
            Threading.Thread.Sleep(3500)
            _rs232.Write(StringData & vbCrLf)
            Threading.Thread.Sleep(3500)
            _rs232.Write(StringData & vbCrLf)
            Threading.Thread.Sleep(3500)
            Me.rtbTX.AppendText(.Text & vbCr)

            '***********************************************************************************************************************************************************************************************************************************************
            .Text = String.Empty & vbCrLf
            Data = Encoding.Default.GetBytes(.Text)
            _rs232.SendData(Data)
            '***************************************************************************************************************************************************************************************************************************************************
            Threading.Thread.Sleep(6500)
        End If
    Next

标签: vb.netascii

解决方案


您正在寻找的是异步编程,它允许您同时执行多个线程。在您的示例中,您必须执行上面的代码,该代码在单独的线程中发送未完成的名称。有两种方法可以做到这一点:

使用 System.Threading:将要执行的代码放在子例程中的单独线程中,然后像这样调用它:

Dim newThread As New Threading.Thread(AddressOf myFunction)
newThread.Start()

现在调用 myFunction 的函数中的代码被执行了,但是当前函数的执行还在继续,这样你仍然可以接收事件。

您还可以使用更新的 Threading.Tasks 命名空间,它可以以类似的方式使用:

Dim newTask As Task = Task.Factory.StartNew(AddressOf myFunction)

推荐阅读