2012-04-07 3 views
0

그래서 지금 C#을 사용하고 있습니다. 필자가 작성한 첫 번째 응용 프로그램은 간단한 콘솔 기반 IRC 클라이언트입니다. 그러나 생각보다 어렵습니다. 두 스트림에서 읽으므로 콘솔 & irc-server 비 차단 입출력이 필요합니다. 나는 다음과 같은 코드를 가지고있어 순간네트워킹 블로킹 비 블로킹, 스레드 만 옵션으로 사용 하시겠습니까?

그러나

while (((sInput = sr.ReadLine()) != null) || ((uuInput = Console.ReadLine()) != null)) 
       { 
        // stuff 
       } 

, 이것은 항상 Sinput의 실행 것, .ReadLine()는 마지막에 True를 반환 그래서 결국 차단하고, 그래서 때문에 두 번째 블록 OR의 내용은 결코 실행되지 않을 것입니다.

이 해결책은 무엇입니까? 스레드로 직접 구현 하시겠습니까? 표준 C# 라이브러리에서 NIO 라이브러리를 찾을 수없는 것 같습니다. 이 프로그램을 지나치게 복잡하게 만들고 싶지 않기 때문에 작고 깨끗한 솔루션을 선호합니다.

도움이 될 것입니다. 감사.

+0

그냥 FYI : 찾고 싶은 것은 비동기 호출로 IO를 처리하는 것입니다. 당신은 non-blocking 소켓을 원하지 않는다. –

답변

1

C# 학습에 관해서는 분명히 깊은 자리에 뛰어 들었을 것입니다. 설정 한 질문 태그를 기반으로 직접 입력/출력 문제보다 네트워킹 측면에 더 많은 도움을 준 것으로 가정합니다. 당신이 사용하는 언어에 상관없이 네트워킹은 확실히 사소한 것이라고 말할 수는 있습니다. 아마도 당신을 도울 수있는 가장 좋은 방법은 당신이 구현하고자하는 것을 보여주는 예제의 방향으로 당신을 안내하는 것입니다. networkComms.net, 오픈 소스 네트워크 라이브러리는 채팅 응용 프로그램 중 하나 인 here (길이가 11 라인)을 가지고 있습니다. 외모를 가진 후에 질문이 있으시면 알려주십시오.

0

BeginRead()과 같은 비동기 작업을 사용해 볼 수도 있지만 StreamReader 대신 Stream을 사용하는 것이 좋습니다.

그래서 저는 여러분이 다른 스레드를 생성하고 거기에서 다른 블로킹 호출을 수행하면 가장 쉬운 방법이라고 생각합니다. 그러나 그렇게한다면, 아마도 lock을 사용하여 두 스레드가 공유하는 모든 리소스에 대한 액세스를 동기화하는 것을 잊지 마십시오.