1

C# TCP サーバーからのメッセージを継続的にリッスンする必要があるため、別のスレッドで行います。

private void StartMessageReceivingLoop()
{       
    new Thread(){
        public void run()
        {
            String msg = null;

            try
            {
                msg = inputStream.readLine(); // inputStream is a BufferedReader instance.
            } 
            catch (IOException e)
            {
                e.printStackTrace();
            }

            if (msg != null && msg != "")
                NotifyAndForwardMessage(msg); // Notify listeners about the message.

            run(); // Next iteration.
        }
    }.start();
}

私のアプローチの何が問題になっていますか?StackOverflowError が発生するのはなぜですか? run()非ブロッキングであるため、非常に高速に呼び出されるBufferedReader.readLine()と思いますが、どうすればよいですか?

4

1 に答える 1

3

run()以内に電話しないでくださいrun()。これは再帰関数ではありません。ある条件まで読み続けたい場合は、これを while ループで囲みます。実行中に実行中のメソッドを呼び出すと、別のスタック フレームが作成されます。あなたが本当に欲しいのは、ただループすることです。

public void run() {
   String msg = null;
   while(true) {  // Or whatever your exit condition is...
      try {
         msg = inputStream.readLine();
      } catch(IOException e) {
         // Handle properly.
      }
      if (msg != null && msg != "") {
          NotifyAndForwardMessage(msg);
      }
   }
}

説明を助けるために、それは次のように機能します...

Thread.start()
   + run() // 1 (called by thread)
      + run() // 2 (called by previous run)
         + run() //3 (called by previous run)
            +etc... where you'll eventually run out of stack space.
于 2015-01-04T22:43:56.023 に答える