2013-06-20 2 views
0

계량기 소켓을 읽고 GUI에서 값을 업데이트하고 싶습니다.소켓에서 계속 데이터를 받고 선택한 데이터를 읽음

소켓은 현재 무게 값을 연속적으로 보냅니다. 내 데이터 (가중치)는 100 바이트 미만입니다.

버퍼를 100으로 지정하면 나머지 바이트를 모두 읽어야하므로 현재 값을 업데이트하는 데 너무 많은 시간이 소요됩니다. 그래서, 버퍼 크기를 4096 바이트로 변경했습니다. 이제 값이 실시간으로 업데이트됩니다.

내 질문/대답
--- 4096 바이트는 실제로 성능에서 큰 오버 헤드가 되는가? (100 바이트와 비교했을 때) ??
--- 사용 가능한 모든 데이터를 지우고 메시지를받을 때 마지막 100 바이트를 읽을 수 있습니까 ??

내가 콜백을 위해 사용하고 코드 :

private void ReceiveCallback(IAsyncResult ar) 
     { 
      try 
      { 
       //Get received bytes count 
       var bytesRead = _clientSocket.EndReceive(ar); 
       if (bytesRead > 0) 
       { 
        //Copy received bytes to a new byte array 
        var receivedBytes = new byte[ReceiveBufferSize]; 

        Array.Copy(_buffer, 0, receivedBytes, 0, 100); //100 byte is enough for checking the data 

        FormatAndUpdateGUI(receivedBytes); 

       } 
       else 
       { 
        throw new Exception("Error in Reading"); 
       } 
     //Read more bytes 
        _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, 0, new AsyncCallback(ReceiveCallback), null); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error in Reading"); 
      } 
     } 
+0

'catch'블록에'throw new Exception ("...")을 넣는 것은 꽤 무의미합니다. 방금 실제 * 예외를 버렸습니다. throw하는 예외의 생성자 ('InnerException'이됩니다)에'ex'를 건네 주면됩니다. 그렇지 않은 경우에는'try/catch'를 모두 제거하면됩니다. –

+1

'bytesRead> 0' 인 경우 ** 100 **과 같은 ** 보장이 없습니다. –

답변

1

당신이 어떤 주어진 시간에 가능한 최대 데이터를 읽을 수 있도록 항상 bytesRead 읽기해야합니다. 이 경우 byte 크기 배열 bytesRead 배열을 사용하여 메모리 사용을 최적화하여 미리 정의 된 최대 값이 아닌 필요한 값과 정확하게 일치시킬 수 있습니다.

관련 문제