【问题标题】:Streamreader - reading data from IPStreamreader - 从 IP 读取数据
【发布时间】:2013-04-10 14:32:41
【问题描述】:

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

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

TIA, 约翰

【问题讨论】:

  • 要么不要使用ReadLine,要么从另一个线程调用ReadLine
  • 我不是故意粗鲁的。我真的很好奇。为什么选择 TIA?我从来不明白说“提前致谢”背后的原因。它似乎总是比什么都粗鲁,比如“我已经谢谢你了,所以当你真的帮助我时,不要指望谢谢”。只有我吗?将其缩写为 TIA 似乎是锦上添花。不要误会我的意思。我假设你根本不打算粗鲁,我只是一直认为这很奇怪。在任何情况下,表示感谢或将您的名字放在问题的末尾都是不受欢迎的。有关详细信息,请参阅faq
  • 点得好,谢谢。
  • @StevenDoggart - 我认为 TIA 很有礼貌,提前感谢某人抽出时间提供帮助。无论哪种方式,本网站都不需要它。
  • @MattWilko 似乎该页面上的共识通常对我有利,或者至少这是我选择解释它的方式。提前欢迎您:)

标签: vb.net streamreader readline


【解决方案1】:

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

【讨论】:

  • 感谢史蒂夫,这正是我需要理解的。还有一个问题,我看不到 ReadLineAsynch 作为 StreamReader 的成员。我在 NetworkStream 上打开 StreamReader。我在 VS2008 中使用 .Net 2.0 - 这是一个问题吗?
  • 嗨,史蒂夫 - 您提供的示例将完成这项工作。感谢您的时间和知识。
  • 还有一个问题,史蒂夫。如果我在线程中使用无限循环,程序关闭时线程会关闭吗?我问是因为当我在 VS 中运行调试模式并退出程序时,它仍然处于调试模式,直到我单击停止调试按钮。对不起,如果这些是愚蠢的问题,但线程对我来说是全新的。
  • 是的,我的理解是,如果它是后台线程(默认情况下),那么它们不会阻止应用程序停止。如果一个线程被设置为前台线程,应用程序不会完全停止,直到额外的前台线程也被终止。您也可以随时致电Thread.Abort。就 Async 方法而言,确实,那些在 .NET 2.0 中并不存在。因此,如果您想使用显式异步方法,则必须使用 NetworkStream 本身可用的方法,并完全放弃使用 StreamReader
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2018-09-27
  • 2013-04-20
相关资源
最近更新 更多