0

我正在连接一个通过 IP 发送数据的仪器。我想将我的阅读代码放在一个计时器中,以便在用户与程序交互时在后台读取数据。我的问题是它出现了streamreader readline 块。真的吗?如果是这样,我应该如何在没有阻塞的情况下从输入设备读取一行?

我还应该注意我的流式阅读器是一个网络流。目标框架也是Net 2.0。不确定这是否重要。

TIA,约翰

4

1 回答 1

0

StreamReader.ReadLine是一种阻塞(同步)方法。当您调用它时,它将阻止执行继续,直到收到完整的行。这使它更容易使用,但显然,如果您需要它异步工作,它不能满足您的需求。

StreamReader包含许多它的方法的阻塞和异步版本。例如,除了ReadLine方法之外,还有一个ReadLineAsync方法与 执行相同的操作ReadLine,但它是异步执行的。

因此,您的选择是,要么您需要使用其中一种异步方法,要么您可以继续使用该ReadLine方法,即使它是一个阻塞方法,只要您从另一个线程调用它。如果它阻塞了一个后台线程,其唯一目的是读取流,那对你来说并不重要,只要 UI 线程没有被阻塞。因此,例如,您可以使用这样的方法:

Private Sub MonitorStream
    While True
        ProcessLine(_Reader.ReadLine)
    End While
End Sub

然后,您可以在新线程中调用该方法,如下所示:

Dim t As New Thread(AddressOf MonitorStream)
t.Start()

这只是一个简单的例子。您可能想检查流是否打开而不是无限循环等等。但这应该给您一个起点。我会说使用该ReadLineAsync方法可能会更好,但是对于了解异步编程的人来说,单独线程中的无限循环更容易使用和理解。

于 2013-04-10T19:03:50.980 回答