C# 尝试调用ReadLine()时完成程序挂起

C# 尝试调用ReadLine()时完成程序挂起,c#,sockets,freeze,C#,Sockets,Freeze,考虑以下几点: private void Read() { StreamReader r = new StreamReader(clientObject.GetStream()); string str = r.ReadLine(); if ((str == null) || (str == "")) { Disconnect(); } Client_dataReceived(str); Read(

考虑以下几点:

    private void Read()
    {
        StreamReader r = new StreamReader(clientObject.GetStream());
        string str = r.ReadLine();
        if ((str == null) || (str == "")) { Disconnect(); }
        Client_dataReceived(str);

        Read();
    }
当我将此客户端连接到服务器时,它将挂起。当我用智能感知打破它, “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里面的Read。它在哪里断裂并不重要

private void Read()
{
    StreamReader r = new StreamReader(clientObject.GetStream());
    string str = r.ReadToEnd();
    if ((str == null) || (str == "")) { Disconnect(); }
    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()之后的code>语句
在您的第一个代码段中。

您想做什么?读取通过发送的数据行,然后将其传递给客户端。\u dataReceived void,以便对其进行分析。递归地,我的意思是。你需要循环通过流来获得所有的数据。谢谢你,我会测试这个!不幸的是,同样的问题。。。无论如何,谢谢,也许它永远不会返回空字符串,从而破坏了第二个示例。请记住null和empty是两个不同的值。
ReadLine
不是阻塞了吗?服务器是否至少发送了一行数据?它应该正在发送数据。。。不过我会检查一下,因为我只剩下这些了。什么是clientObject?并非所有流在到达末尾时的行为都相同。是的,它挂在这里“while((str=r.ReadLine())!=null)”
 private void Read()
    {
        using (var r = new StreamReader(clientObject.GetStream()))
        {
            string str;
            while ((str = r.ReadLine()) != null)
            {
                Client_dataReceived(str);
            }
            Disconnect();
        }
    }