짧은 시작 요청을 처리하기 위해 동기식 Begin ..을 사용하여 전환 한 네트워크 서버가 있습니다. 긴 수명의 스레드의 경우 두 개의 스레드가 만들어지고 클라이언트 수가 증가하면서 문제가되기 시작합니다.길이가 한정되지 않은 데이터를 비동기로 파싱
이러한 연결을 통해 전송되는 데이터는 4 - 40 바이트의 메시지입니다. 그러나 길이가 한정되어 있지 않으며 길이는 메시지 안의 부품에 따라 달라질 수 있습니다. 그리고 슬프게도 프로토콜을 변경할 수 없습니다. 이 프로토콜은 빠른 속도의 텔넷 터미널 프로토콜로 생각할 수 있습니다.
나는 독서에보고 Stream.BeginRead 사용하여 수신 메시지/"선"을 구문 분석하고 두 가지 걱정에 도달 해요 :
- 는 10 바이트 메시지 그러면 BeginRead에게 약 3 배를 호출 효율적인가요? 하나의 예는
- 가 어떻게 효율적으로 여기이
을하는 코드를 작성 할 수 있습니다. 메시지 자체의 길이는 접두어가 아니지만 일부 내용은 접두어가 될 수 있습니다.
동기 방식 (전류)
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는 옵션이므로 기다려야 비동기 프로그래밍을 수행해야합니까?
이 코드는 인터넷에 직면하게 될 것이고, 들어온 수신 연결은 동기화 읽기를 사용하면 스레드 풀 스레드를 잠글 것입니다.