2009-03-02 5 views
0

C#에서는 BeginReceive/EndReceive 메서드로 네트워크 데이터를 수신 할 때 패킷을받는 즉시 패킷을 처리하지 않아야하는 이유가 있습니까? 일부 작업은 적절한 CPU 집약적 인 작업 일 수 있습니다. 패킷을 처리 대기열로 밀어 넣은 다음 처리하는 구현을 보았 기 때문에 물어 봅니다. 나에게 이것은 내가 알고있는 한, 비동기 메서드 인 이 스레드 풀에서 작동하기 때문에 불필요한 것처럼 보인다.비동기 루프에서 패킷을 처리 중이거나하지 않습니까?

답변

1

미치가 지적했듯이 완전한 메시지/프레임을 갖기에 충분한 패킷을 수신 할 수 있어야합니다. 그러나 그 프레임을 즉시 처리하지 말고 또 다른 BeginReceive를 발행 할 이유가 없습니다. 사실, 처리에 시간이 걸릴 것으로 생각된다면 콜백이 실행되는 곳인 I/O 풀에서 스레드를 차단하는 대신 작업자 스레드 풀로 처리하는 것이 좋습니다.

또한 연결 수가 적을 것으로 예상하지 않는 한 각 연결을 처리하기 위해 스레드를 생성하는 것은 매우 단순한 이점이 있지만 확장 성이 뛰어난 방법은 아닙니다.

최근 네트워크 소켓에서 데이터 처리를 파이프 라이닝하는 기사를 작성했습니다.이 자료는 here입니다.

3

일반적으로 처리 할 수있는 데이터 항목을 갖기 위해서는 '충분한'패킷을 받아야합니다.

IMO, 실제로 데이터를 수신하는 스레드와 실제로 처리하는 스레드가있는 것이 좋습니다.