NetworkStream.ReadAsyn c похоже на большинство методов «дай мне буфер байтов», с которыми я сталкивался; Вы даете ему байтовый массив и просите его прочитать количество байтов из сети X и поместить его в буфер. Он может читать меньше, чем вы просили, но больше не будет читать. Возвращает количество прочитанных байтов. Ваш код всегда держится в буфере байтового массива, поэтому вы должны выполнить что-то вроде этого:
byte[] buf = new byte[4096];
int bytesRead = await networkStream.ReadAsync(buf, 0, buf.Length. someCancelationToken);
byte[] rtn = new byte[bytesRead];
Array.Copy(buf, 0, rtn, 0, rtn.Length);
return rtn;
То есть вы читаете как Asyn c op, а затем возвращаете размер массива точное количество байтов, сообщаемых как прочитанные, которые поступают из буфера. Метод, использующий этот код, будет возвращать задачу
. NetworkStream также имеет метод CanRead, который должен соответствовать вашему требованию «если нечего читать»
Существует также перегрузка ReadAsyn c, который принимает от вас Память в качестве буфера. Вы бы использовали это аналогичным образом, за исключением того, что вызывали бы метод Slice, когда вы знали, сколько байтов было прочитано, чтобы вернуть вам память, смотрящую только на этот раздел буфера. Если бы вы вызвали ToArray в результате вызова Slice, вы бы получили массив по своему вкусу (считанные байты). Скорее всего, в этом контексте разница между ними невелика, хотя использование Memory (и связанного с ней класса Span) может уменьшить количество выделенных памяти для некоторых операций