2013-06-20 2 views
0

Я хочу прочитать разъем весов и обновить его значение в графическом интерфейсе.Непрерывно получать данные из сокета и считывать выбранные данные

Сокет будет передавать текущее значение веса непрерывно. Мои данные (вес) будут меньше 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

Вложение 'throw new Exception (" ... ")' в блок 'catch' довольно бессмысленно. Вы просто выбросили исключение * actual *. Я рекомендую либо передать 'ex' конструктору исключения, которое вы бросаете (оно становится' InnerException'), либо для этого случая просто удалите весь внешний 'try/catch'. –

+1

если 'bytesRead> 0', есть ** нет ** гарантия, что он равен 100. –

ответ

1

Вы всегда должны читать в bytesRead, так что вы читали максимально доступные данные в любой момент времени. В этом случае вы также можете оптимизировать использование памяти с помощью массива byte размера bytesRead, чтобы он точно соответствовал тому, что вам нужно, а не определенному максимальному максимуму.

Смежные вопросы