vb.net - 从VB中的串行读取数据时无阻塞等待

标签 vb.net multithreading serial-port delay sleep

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

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

有什么非阻塞性的等待方式吗?
首先,我尝试了Threading.Thread.Sleep(15000),但是这完全锁定了程序。

我还尝试了非常类似的方法(该方法仍然使用 sleep ,但间隔较小)。阻塞仍然存在,仅间隔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

在调用等待功能之前,应该将串行读取功能设置为单独的线程吗?

最佳答案

一般来说,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

这很有用,因为您不必考虑太多。只要您在另一个函数中是异步的,就可以或多或少地将其编写为好像是同步的。

关于vb.net - 从VB中的串行读取数据时无阻塞等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572607/

相关文章:

Windows x64 中使用 JRE x86 的 Java 串行 I/O

wpf - XAML 中 namespace 错误中不存在该名称

c# - 当列名有空格时从 DataTable 中的字段获取值

java - 仅在读取时是否必须使用线程安全的 Map 实现?

c++ - 等待 win32 线程

java 多线程并发两个或多个线程?

C 函数在串口关闭之前不会发送

c - 从串口读取数据

.net - Entity Framework 死锁和并发

vb.net - VB.NET 中的字节数组数组