2011-03-10 5 views
0

다른 스레드에서 실행 중일 때 Console.ReadLine 메서드를 중지하는 방법을 아는 사람이 있습니까? 그것은 작동하지만 문제는 최대한 빨리 단일 문자를 입력 할 때, 서버가 원 않습니다다른 스레드에서 콘솔 중지 읽기

while (true) 
{ 
    while (!Console.KeyAvailable) Thread.Sleep(100); 
    string line = Console.ReadLine(); 
} 

:

는 지금은 다음과 같이 작동 코드 (그것의 루프 부분)을 사용 종료.

아무에게도이를 수행하는 방법을 알고 있습니까? (Start() 메서드를 호출하고 Stop() 메서드 호출 후에 콘솔 라인을 읽을 수있게되면 완전히 다른 접근 방식도 환영합니다.

답변

1

IsBackground 속성을 true로 설정합니다 이 루프를 실행중인 스레드에 대해. 그렇게하면 CLR이 응용 프로그램을 완전히 종료 할 수 있습니다.

+0

응용 프로그램을 종료하고 싶지 않습니다. 읽기를 중지하고 싶습니다. 그리고 IsBackground 속성에 대해 알고 있지만 너무 중단을 위해 작동합니까?아니면 그냥 닥쳐? – Aidiakapi

1

ReadLine 대신 KeyAvailable 및 ReadKey를 사용하십시오. 또는 콘솔 소비자 스레드에서 Thread.Abort를 호출 할 수도 있습니다.

+0

시도해보고 목록에 저장 한 다음 문자열로 변환했습니다. 너무 잘 작동하지 않았고, 백 스페이스 충돌이 발생했기 때문에, 저의 작동 예제를 제게 제공 할 수 있었습니까? – Aidiakapi

3

Console.ReadLine은 내부적으로 TextReader.ReadLine을 호출합니다. 기본 스트림이 닫히면 종료됩니다. 주 스레드에서 Console.In.Close()으로 전화하면 작동 할 수도 있고 콘솔 입력 스트림을 닫지 못할 수도 있습니다. 그것을 시도하고 볼 수 있습니다.

잊어 버리십시오. Console.In.Close()가 작동하지 않는 것 같습니다.

업데이트

이 포스팅은 매우 비슷한 일을하는 방법의 모든 종류가 있습니다 How to add a Timeout to Console.ReadLine()?

(삭제 코드가 작동하지 않았기 때문에)

또 다른 업데이 트를

나는 더 많은 조사를했고 이것은 내가 발견 한 것이다 :

  • 콘솔이 라인 모드입니다.

  • 사용자는 Read, ReadLine 또는 Peek가 호출 될 때까지 줄 모드로 텍스트를 입력 할 수 없습니다.

  • 사용자가 Enter 키를 누를 때까지 ReadLine 및 Peek 블록을 읽습니다.

  • 따라서 우리는 콘솔에서 라인 입력을 처리 할 수 ​​없거나 차단 문제가 발생합니다.

  • 그래서 우리는 등을 KeyAvailable 및 ReadKey을 사용하고 삭제를 관리해야 자신

    이 문서는 ReadKey 입력 처리의 예를 가지고

: 당신은 항상 KeyAvailable를 호출하는이 기능을 개정하는 경우 http://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar.aspx

을 ReadKey를 호출하고 입력이 없으면 잠자 지 말기 전에 차단을 피할 수 있습니다.

+0

시도해 보았지만 다시 시작하는 방법을 모르겠다 ... 아시나요? – Aidiakapi

+0

한 스레드를 Console.In에서 분리하고 다른 스레드를 시작하여 다시 연결하려면 입력을 어떻게 동기화할까요? 첫 x 째 서 v가 행의 일부를 읽은 경우, 두 x 째 서 v는이를 볼 수 없습니다. – arx

+0

아니, 그건 서버를위한거야, 당신은 특정 순간에만 데이터를 입력 할 수 있습니다. – Aidiakapi

관련 문제