
[英]Can A MatchCollection hang the program when trying to iterate it?
[英]Complete program hang when trying to call ReadLine()
考虑以下:
private void Read()
{
StreamReader r = new StreamReader(clientObject.GetStream());
string str = r.ReadLine();
if ((str == null) || (str == "")) { Disconnect(); }
Client_dataReceived(str);
Read();
}
当我将此客户端连接到服务器时,它挂起了。 当我用Intellisense打破它时,“ string str = r.ReadLine();” 突出显示,我认为这就是程序在挂起之前正在处理的内容。 为什么会这样挂? 我以前以完全相同的方式创建了应用程序,但它们不会挂起。
提前致谢!
编辑:我只是尝试这样做:
private void Read()
{
StreamReader r = new StreamReader(clientObject.GetStream());
string str;
while ((str = r.ReadLine()) != null)
{
Client_dataReceived(str);
}
}
但是我得到了同样的效果...
因为它是没有退出的递归调用。 您在Read中调用Read。 它在哪里中断都没有关系。
private void Read()
{
StreamReader r = new StreamReader(clientObject.GetStream());
string str = r.ReadToEnd();
if ((str == null) || (str == "")) { Disconnect(); }
Client_dataReceived(str);
}
private void Read()
{
StreamReader r = new StreamReader(clientObject.GetStream());
string str;
while (!(String.IsNullOrEmpty(str=r.ReadLine())))
{
Client_dataReceived(str);
}
}
您有一个递归调用。 您最终将获得一个StackOverflowException。 (真是巧合。我才意识到!)
尝试这个:
private void Read()
{
using (var r = new StreamReader(clientObject.GetStream()))
{
string str;
while ((str = r.ReadLine()) != null)
{
Client_dataReceived(str);
}
Disconnect();
}
}
注意:我有意删除了str ==“”测试,因为返回空字符串并不意味着您已经读到流的末尾,而返回null却可以。 如果您有特殊情况需要触发空行,请确保恢复该测试。
现在,如果clientObject是等待输入的内容(例如TcpClient),则需要对它进行不同的评估。 如果我们知道什么是clientObject,那将有所帮助。
由于声誉低下,我无法发表评论,所以我在这里写...
尝试添加return();
disconnect();
之后的语句disconnect();
在您的第一个代码段中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.