繁体   English   中英

尝试调用ReadLine()时,完整的程序挂起

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM