Я хочу прочитать разъем весов и обновить его значение в графическом интерфейсе.Непрерывно получать данные из сокета и считывать выбранные данные
Сокет будет передавать текущее значение веса непрерывно. Мои данные (вес) будут меньше 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");
}
}
Вложение 'throw new Exception (" ... ")' в блок 'catch' довольно бессмысленно. Вы просто выбросили исключение * actual *. Я рекомендую либо передать 'ex' конструктору исключения, которое вы бросаете (оно становится' InnerException'), либо для этого случая просто удалите весь внешний 'try/catch'. –
если 'bytesRead> 0', есть ** нет ** гарантия, что он равен 100. –