2

コンソールの標準入力ストリームをリッスンするプログラムがあります。

  • 戻るとRead()、すべての文字が 1 つずつ読み取られ、 に渡されmethod()ます。
  • method()次に、文字を a に追加しStringBuilderます。
  • 文字が の場合、 が'\n'呼び出さmethod()respond()、読み取った文字が出力され、 がクリアされますStringBuilder

ただし、コンソールに何かを入力してEnterキーを押した後でも、入力したテキストをエコーするには、コンソールのフォーカス内でマウス、マウスボタン、またはキーボードを押す/移動する必要があります。さらに不思議なのは、 の最初の中かっこにブレークポイントを設定し、Main()その後のすべてのステートメントにステップインすると、プログラムが正しく実行されることです。どうすればこれを修正できますか? どうもありがとう!

public class test
{
    static byte[] buffer = new byte[1];
    static Stream instrm = Console.OpenStandardInput();
    static Stream outstrm = Console.OpenStandardOutput();
    static System.Text.StringBuilder sb = new System.Text.StringBuilder();
    static void Main()
    {
        while (true)
        {
            instrm.Read(buffer, 0, 1);
            method(buffer);
        }
    }
    public static void method(byte[] buffer)
    {
        sb.Append(System.Text.Encoding.UTF8.GetString(buffer));
        if (buffer[0] == (byte)10) respond();
    }
    public static void respond()
    {
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
        outstrm.Write(bytes, 0, bytes.Length);
        outstrm.Flush();
        sb.Clear();
    }
}

編集:
テストしたところ、スレッドとは何の関係もないことがわかったので、その部分を取り除きました。他のプログラムの問題だったので、最初に投稿しました。これは、それを実証するためのテストモデルにすぎません。

4

1 に答える 1

5

プログラムを次のように変更します。

static byte[] buffer = new byte[1];
static TextReader instrm = new StreamReader(Console.OpenStandardInput());
static TextWriter outstrm = new StreamWriter(Console.OpenStandardOutput());
static StringBuilder sb = new StringBuilder();
static void Main()
{
  while (true)
  {
    var readLine = instrm.ReadLine();
    respond(readLine);
  }
}

public static void respond(string line)
{
  outstrm.Write(line);
  outstrm.Flush();
}

それはより簡単で機能します。主な違いは、for の代わりにStreamReaderandを使用することです。StreamWriterStream

于 2012-09-03T13:16:40.110 に答える