2012-09-03 87 views
2

我有一個程序,監聽控制檯stdin流。c#stdin讀取沒有響應

  • Read()返回時,每個字符被逐一讀出並傳遞到method()
  • method()然後將字符附加到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(); 
    } 
} 

編輯:
我只是測試,並發現它有什麼做的線程,因此採取了部分路程。我最初發布它是因爲它在我的其他程序中是一個問題,這只是一個演示它的測試模型。

+1

是否有意讓您的Main方法結束? –

+0

請將文字,大寫字母和空格添加到您的文本中,以便我可以解讀它。 – Jodrell

+0

@HenkHolterman確實打敗了多線程的觀點。 – Jodrell

回答

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

這是比較容易和作品。主要區別在於使用StreamReaderStreamWriter代替Stream

+0

我怎麼能忘記這些類?謝謝!仍然,我沒有得到什麼錯我的程序。 – irisjay

+0

由於readline()以「\ r \ n」,「\ n」或「\ r」結尾,雖然它不會影響我的程序,但我決定嘗試使用streamreader的read() 。所以我很確定問題在於MS的流read()的錯誤實現。 – irisjay