저는 C#에서 비 블로킹 소켓을 사용하여 소켓 프로그래밍을 시도하고 있습니다. this과 같이 발견 된 다양한 샘플은 while (true) 루프를 사용하는 것으로 보이지만이 방법을 사용하면 CPU가 100 % 버스트됩니다. 이벤트 프로그래밍 스타일을 사용하여 비 블로킹 소켓을 사용할 수 있습니까? 덕분에 적용 일반적으로, IO를 비 차단/차단에 대해 일반적으로 이야기while (true) 루프가없는 C# 비 블로킹 소켓
답변
는 :
중요한 것은 실제 생활에서 프로그램이 IO를하고 있지 동안다른 일을한다는 것입니다. 예제는 모두 이런 방식으로 고안되었습니다.
IO를 차단할 때 IO를 기다리는 동안 스레드가 '차단'됩니다. 운영체제는 다른 것들을 수행합니다. 다른 스레드를 실행할 수 있습니다. 따라서 응용 프로그램은 여러 스레드를 사용하여 개념적으로 많은 것을 병렬로 수행 할 수 있습니다.
논 블로킹 IO에서는 스레드가 IO가 가능한지 확인하기 위해 쿼리하고 그렇지 않은 경우 다른 작업을 수행합니다. 따라서 응용 프로그램 수준에서 명시 적으로 여러 가지 작업을 병렬로 수행합니다. Socket.BeginReceive 및 AsyncCallback
는 MSDN 예제 here를 참조하십시오. 이 예는 비동기 적으로 데이터를 수신하는 f}을 보여줍니다. Socket BeginSend/EndSend 메서드를 사용하여 데이터를 비동기 적으로 보낼 수도 있습니다.
콜백 위임은 ThreadPool 스레드의 컨텍스트에서 실행된다는 점에 유의해야합니다. 콜백 내부에서 수신 된 데이터를 다른 스레드 (예 : Windows 양식의 데이터를 표시하는 기본 UI 스레드)와 공유해야하는 경우 중요합니다. 그렇다면 예를 들어 lock
키워드를 사용하여 데이터에 대한 액세스를 동기화해야합니다.
비 블로킹 소켓과 while 루프를 사용했음을 눈치 챘을 때 프로세서는 100 % 고정되어 있습니다. 비동기 모델은 보내거나받을 데이터가있을 때만 콜백 위임을 호출합니다.
무거운 while 루프에서 CPU 문제가 발생하지 않도록하려면 데이터를 수신하지 않을 때 thread.sleep(100)
이하를 입력하십시오. 그러면 다른 프로세스가 자신의 작업을 수행하도록 변경됩니다.
- 1. 비 블로킹 소켓
- 2. 비 블로킹 소켓
- 3. 비 블로킹 유닉스 소켓 속도 향상 (C++)
- 4. Java 소켓 비 블로킹 읽기
- 5. C# 소켓 블로킹
- 6. Java 비 블로킹 소켓 플러시 작업
- 7. 블로킹 소켓 반환 EAGAIN
- 8. Perl 논 블로킹 소켓
- 9. 실행 루프가없는 MacOSX 소켓 프로그래밍
- 10. 블로킹 소켓 클라이언트 예제
- 11. 비 블로킹 동시 수집?
- 12. Java Linux 비 블로킹 소켓 타임 아웃 동작
- 13. 비 블로킹 배치 파일을 실행
- 14. 이벤트 대 while (true) 루프
- 15. 비 소켓 소켓 작업
- 16. 비 블로킹 파일 디스크립터 유닉스 네트워크 프로그래밍
- 17. javanio로 블로킹에서 비 블로킹 I/O로 전환
- 18. 비 블로킹 UI WPF/Silverlight
- 19. 비 블로킹 소켓에 sendfile() 완료
- 20. Tomcat 6 CometProcessor에서 쓸 수있는 비 블로킹
- 21. 비 차단 udp 소켓 프로그래밍 C : 무엇을 얻을 수 있습니까?
- 22. 자바의 비 블로킹 소켓에 객체를 직렬화하려면 어떻게해야합니까?
- 23. QTextStream을 사용하여 stdin을 비 블로킹 방식으로 읽음
- 24. 자바의 루프에서 while (true)을 제거하려면 어떻게해야합니까?
- 25. while (true)과 loop의 차이점은 무엇입니까?
- 26. 장치 드라이버 DLL 블로킹과 비 블로킹?
- 27. 간단한 스레드 안전 비 블로킹 파일 로거 클래스 (C#
- 28. 비 블로킹 소켓을 사용하여 accept()를 호출하는 방법 C++
- 29. 콘솔 C++ 프로그램에서 간단한 비 블로킹 팝업 창을 만드는 방법?
- 30. C# 컴팩트 프레임 워크 비 블로킹 소켓을 만드는 방법
이 답변은 논 블로킹 IO를 원하는 이유에 대한 이론을 제공하지만 구현 방법에 대한 포스터의 질문에는 실제로 대답하지 않습니다. – squawknull