【发布时间】:2015-02-19 07:08:06
【问题描述】:
我正在尝试读取流,流仍在继续。
我已经了解了以下内容,但我觉得有点奇怪,我必须经常检查空流字符。有没有办法让线程休眠,直到有更多数据?
这里的速度非常重要,因为它必须处理高负载。
NetworkStream networkStream = client.GetStream();
try
{
var reader = new StreamReader(networkStream);
StringBuilder stringBuilder = new StringBuilder();
char c = (char)reader.Read();
while (true)
{
if (c != (char)65535)
{
if (c == StreamSettings.MessageSplitChar)
{
// Do work with string here
}
else
{
stringBuilder.Append(c);
}
}
else
{
// No work to do sleep some
Thread.Sleep(10);
}
c = (char)reader.Read();
}
}
catch (Exception ex)
{
throw;
}
【问题讨论】:
-
好吧,你不知道。如果您从 StreamReader.Read() 获得 -1,则将不再接收数据。您不妨使用 ReadToEnd(),然后处理文本。传输文本通常更聪明的方法是首先发送字节数,以便接收者知道何时停止读取。例如,这就是 HTTP 的工作原理。
-
流另一端的客户端正在生成数据。因此,在搜索已读取到流末尾的消息之间可能会有时间,但客户端稍后会写入更多。如果我读到最后,它将永远不会结束,因为流将在客户端的生命周期内保持打开状态。
-
这没什么意义,如果是这种情况,StreamReader.Read() 将简单地阻塞而不是返回 -1。 HTTP 方法的优点是不必关闭套接字来指示结束。
-
ReadToEnd() 将继续读取直到流关闭!我想避免关闭流。