0

考虑以下:

    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);
        }
    }

但我得到了同样的效果......

4

4 回答 4

0
private void Read()
    {
        StreamReader r = new StreamReader(clientObject.GetStream());
        string str;
        while (!(String.IsNullOrEmpty(str=r.ReadLine())))
        {
            Client_dataReceived(str);
        }
    }
于 2013-11-09T06:18:28.963 回答
0

你有一个递归调用。你最终会得到一个 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 会有所帮助。

于 2013-11-09T06:18:53.607 回答
0

由于声誉低,我无法发表评论,所以我在这里写...

尝试在您的第一个代码片段return();之后添加一条语句。disconnect();

于 2013-11-09T06:36:09.363 回答
0

因为它是一个没有退出的递归调用。您在 Read 中调用 Read。它在哪里断裂并不重要。

private void Read()
{
    StreamReader r = new StreamReader(clientObject.GetStream());
    string str = r.ReadToEnd();
    if ((str == null) || (str == "")) { Disconnect(); }
    Client_dataReceived(str);
}
于 2013-11-09T06:06:33.663 回答