2013-04-10 96 views
0

我正在连接通过IP发送数据的仪器。我想将我的阅读代码放入计时器中,以在用户与程序交互时读取背景中的数据。我的问题是,它看起来streamreader readline块。真的吗?如果是这样,我应该如何去读取输入设备的一条线而不会阻塞?Streamreader - 从IP读取数据

我还应该注意我的流媒体阅读器是一个Networkstream。目标框架也是Net 2.0。不知道这是否重要。

TIA, 约翰

+0

要么不使用'ReadLine',要么从另一个线程调用'ReadLine'。 – 2013-04-10 14:37:35

+1

我不是故意的。我真的很好奇。为什么是TIA?我从来没有理解说“提前致谢”的理由。它总是比任何事情都更粗鲁,比如“我已经感谢你了,所以当你真的帮助我时,不要期待感谢”。只有我吗?把它简称为TIA似乎只是锦上添花。不要误解我的意思。我假设你根本不打算粗鲁,我一直认为这是一件奇怪的事情。无论如何,在你的问题结束时表示感谢或者说出你的名字是令人不悦的。有关更多详细信息,请参见[faq]。 – 2013-04-10 14:42:12

+0

点好,谢谢。 – 2013-04-10 14:47:02

回答

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方法可能会更好,但对于知道异步编程的人来说,单独线程中的无限循环更容易处理和理解。

+0

谢谢史蒂夫,这正是我需要理解的。还有一个问题,我没有看到R eadLineAsynch作为StreamReader的成员。我在NetworkStream上打开StreamReader。我在VS2008中使用.Net 2.0 - 这是一个问题吗? – 2013-04-10 19:52:05

+1

嗨史蒂夫 - 你给的这个简单的例子将会完成这项工作。我感谢你的时间和知识。 – 2013-04-10 20:40:58

+0

还有一个问题,Steve。如果我在线程中使用无限循环,程序关闭时线程是否会关闭?我问,因为当我运行调试模式并退出VS中的程序时,它仍然处于调试模式,直到我单击“停止调试”按钮。对不起,如果这些都是愚蠢的问题,但线程对我来说都是新的。 – 2013-04-10 22:36:11