0

次の点を考慮してください。

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

しかし、私は同じ効果を得ます...

4

4 に答える 4

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 に答える
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 に答える