2012-09-03 2 views
2

콘솔 stdin 스트림을 수신하는 프로그램이 있습니다.C# stdin read not responding

  • Read() 반환, 모든 문자 하나 하나를 읽고 method()에 전달됩니다.
  • method() 다음 문자를 StringBuilder에 추가합니다.
  • 문자가 '\n' 인 경우 method()respond()을 호출하여 읽은 문자를 인쇄하고 StringBuilder을 지 웁니다.

그러나 콘솔에 무엇인가를 입력하고 Enter 키를 누른 후에도 내 마우스, 마우스 단추 또는 콘솔의 포커스 내에있는 키보드를 눌러서 입력 할 텍스트를 입력해야합니다. 더욱 신비한 점은 중괄호 첫 번째 중괄호에 중단 점을 설정하고 그 후에 모든 단일 명령문으로 들어가면 프로그램이 올바르게 실행된다는 것입니다. 이 문제를 어떻게 해결할 수 있습니까? 고마워요!

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

그것은 쉽고 작품이다. 주요 차이점은 Stream 대신 StreamReaderStreamWriter을 사용하는 것입니다.

+0

어떻게 내가 그 수업들을 잊어 버릴 수 있었습니까? 감사! 아직도, 나는 내 프로그램에 무슨 문제가 있는지 모르겠다. – irisjay

+0

Readline()은 "\ r \ n", "\ n"또는 "\ r"으로 끝나기 때문에 프로그램에 많은 영향을 미치지는 않지만 streamreader의 read()를 시도하기로 결정했습니다. . 그래서 메신저의 문제는 스트림의 read()를 잘못 구현 한 MS에 있습니다. – irisjay