在VB中从串行读取数据时无阻塞等待

时间:2017-08-08 15:39:11

标签: vb.net multithreading serial-port delay sleep

我有一个程序GUI方法,需要多次从串口中检索数据。

每次执行此操作时,都需要等待串行数据功能完成(例如,通过平均从串行接收的所有数据,该功能可以工作15秒。)

有什么阻止等待的方法? 起初我尝试了Threading.Thread.Sleep(15000),但这完全锁定了程序。

我也尝试了非常类似的方法(仍然使用睡眠,但间隔较小)。阻止仍然存在,间隔为0.5秒。

Public Sub ResponsiveSleep(ByRef iMilliSeconds As Integer)
    Dim i As Integer, iHalfSeconds As Integer = iMilliSeconds / 500
    For i = 1 To iHalfSeconds
        Threading.Thread.Sleep(500) : Application.DoEvents()
    Next i
End Sub

在调用wait函数之前,我应该将串行读取函数作为一个单独的线程吗?

2 个答案:

答案 0 :(得分:2)

如果在没有轮询的情况下接收数据,您可能会实现DataReceived事件。 更多信息https://msdn.microsoft.com/it-it/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

答案 1 :(得分:1)

一般来说,I / O和任何其他阻塞调用应该放在一个单独的线程上。你最终会得到类似的东西:

Public Async Sub MyUserInterfaceEventThatMakesTheAsyncCallWork()
    Dim result as String = Await ResponsiveSleep()
    MyUserInterface.Text = result
End Sub

Public Async Function ResponsiveSleep() As Task(Of String)
    Await Task.Delay(10000) 'however long you want the delay to be, or delay logic here
    'Calls here should always be Await, or they'll be synchronous
    Return "the result of my thing!"
End Function

这很有用,因为你不必过于考虑它。只要你在另一个函数中异步,就可以或多或少地写它,就好像它是同步的一样。