2012-07-31 1 views
0

짧은 시작 요청을 처리하기 위해 동기식 Begin ..을 사용하여 전환 한 네트워크 서버가 있습니다. 긴 수명의 스레드의 경우 두 개의 스레드가 만들어지고 클라이언트 수가 증가하면서 문제가되기 시작합니다.길이가 한정되지 않은 데이터를 비동기로 파싱

이러한 연결을 통해 전송되는 데이터는 4 - 40 바이트의 메시지입니다. 그러나 길이가 한정되어 있지 않으며 길이는 메시지 안의 부품에 따라 달라질 수 있습니다. 그리고 슬프게도 프로토콜을 변경할 수 없습니다. 이 프로토콜은 빠른 속도의 텔넷 터미널 프로토콜로 생각할 수 있습니다.

나는 독서에보고 Stream.BeginRead 사용하여 수신 메시지/"선"을 구문 분석하고 두 가지 걱정에 도달 해요 :

  1. 는 10 바이트 메시지 그러면 BeginRead에게 약 3 배를 호출 효율적인가요? 하나의 예는
  2. 가 어떻게 효율적으로 여기이

을하는 코드를 작성 할 수 있습니다. 메시지 자체의 길이는 접두어가 아니지만 일부 내용은 접두어가 될 수 있습니다.

동기 방식 (전류)

int length = reader.ReadInt32(); 
byte[] buffer = reader.ReadBytes(length); 

비동기 방식

... 
    //Here we have received a byte array 
    int length = ParseIntegerFromBuffer(buffer); 
    stream.BeginRead(buffer, 0, length, Part1Read, null); 
} 
private void Part1Read(IAsyncResult result) 
{ 
    ... 

비동기 예는 내가 이미 가지고 몇 래퍼를 작성했습니다 사용하고 무엇을하지 않습니다 요청 된 바이트 수를 성공적으로 읽었는지 확인하는 과정. 필자가 얻을 수있는 문서화 된 코드를 작성하고 이해하는 측면에서 효율적인가?

내 코드는 .NET 3.5에서 실행해야하지만 이후에 5는 옵션이므로 기다려야 비동기 프로그래밍을 수행해야합니까?

이 코드는 인터넷에 직면하게 될 것이고, 들어온 수신 연결은 동기화 읽기를 사용하면 스레드 풀 스레드를 잠글 것입니다.

답변

0

비동기 구현을 완료했으며 결과는 연결 당 스레드 하나를 사용하는 디자인보다 CPU로드가 4 배 높습니다.

구문 분석되는 프로토콜 자체가 잘못 설계되어 비동기 적으로 구문 분석하면 더 많은 연결을 관리하는 데 도움이되지 않습니다.