我有一个程序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函数之前,我应该将串行读取函数作为一个单独的线程吗?
答案 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
这很有用,因为你不必过于考虑它。只要你在另一个函数中异步,就可以或多或少地写它,就好像它是同步的一样。