我正在连接通过IP发送数据的工具。我希望将我的阅读代码放在计时器中,以便在用户与程序交互时在后台读取数据。我的问题是它出现了streamreader readline块。真的吗?如果是这样,我应该如何从输入设备读取一行没有阻塞?
我还应该注意我的streamreader是一个Networkstream。目标框架也是Net 2.0。不确定这是否重要。
TIA, 约翰
答案 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
方法可能更可取,但对于熟悉异步编程的人来说,单独线程中的无限循环更容易使用和理解。