2009-11-03 9 views
6

저는 C#에서 비 블로킹 소켓을 사용하여 소켓 프로그래밍을 시도하고 있습니다. this과 같이 발견 된 다양한 샘플은 while (true) 루프를 사용하는 것으로 보이지만이 방법을 사용하면 CPU가 100 % 버스트됩니다. 이벤트 프로그래밍 스타일을 사용하여 비 블로킹 소켓을 사용할 수 있습니까? 덕분에 적용 일반적으로, IO를 비 차단/차단에 대해 일반적으로 이야기while (true) 루프가없는 C# 비 블로킹 소켓

답변

6

3

는 :

중요한 것은 실제 생활에서 프로그램이 IO를하고 있지 동안다른 일을한다는 것입니다. 예제는 모두 이런 방식으로 고안되었습니다.

IO를 차단할 때 IO를 기다리는 동안 스레드가 '차단'됩니다. 운영체제는 다른 것들을 수행합니다. 다른 스레드를 실행할 수 있습니다. 따라서 응용 프로그램은 여러 스레드를 사용하여 개념적으로 많은 것을 병렬로 수행 할 수 있습니다.

논 블로킹 IO에서는 스레드가 IO가 가능한지 확인하기 위해 쿼리하고 그렇지 않은 경우 다른 작업을 수행합니다. 따라서 응용 프로그램 수준에서 명시 적으로 여러 가지 작업을 병렬로 수행합니다. Socket.BeginReceive 및 AsyncCallback

+0

이 답변은 논 블로킹 IO를 원하는 이유에 대한 이론을 제공하지만 구현 방법에 대한 포스터의 질문에는 실제로 대답하지 않습니다. – squawknull

0

는 MSDN 예제 here를 참조하십시오. 이 예는 비동기 적으로 데이터를 수신하는 f}을 보여줍니다. Socket BeginSend/EndSend 메서드를 사용하여 데이터를 비동기 적으로 보낼 수도 있습니다.

콜백 위임은 ThreadPool 스레드의 컨텍스트에서 실행된다는 점에 유의해야합니다. 콜백 내부에서 수신 된 데이터를 다른 스레드 (예 : Windows 양식의 데이터를 표시하는 기본 UI 스레드)와 공유해야하는 경우 중요합니다. 그렇다면 예를 들어 lock 키워드를 사용하여 데이터에 대한 액세스를 동기화해야합니다.

비 블로킹 소켓과 while 루프를 사용했음을 눈치 챘을 때 프로세서는 100 % 고정되어 있습니다. 비동기 모델은 보내거나받을 데이터가있을 때만 콜백 위임을 호출합니다.

4

무거운 while 루프에서 CPU 문제가 발생하지 않도록하려면 데이터를 수신하지 않을 때 thread.sleep(100) 이하를 입력하십시오. 그러면 다른 프로세스가 자신의 작업을 수행하도록 변경됩니다.

관련 문제