Streamreader - 从IP读取数据

时间:2013-04-10 14:32:41

标签: vb.net streamreader readline

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

我还应该注意我的streamreader是一个Networkstream。目标框架也是Net 2.0。不确定这是否重要。

TIA, 约翰

1 个答案:

答案 0 :(得分: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方法可能更可取,但对于熟悉异步编程的人来说,单独线程中的无限循环更容易使用和理解。