Я заметил, что он будет возвращать одни и те же прочитанные символы снова и снова, но мне было интересно, есть ли более элегантный способ.
Проверьте StreamReader.EndOfStream . Остановите цикл чтения, когда это будет true
.
Убедитесь, что ваш код правильно обрабатывает возвращаемое значение для «количества прочитанных байтов» также в вызовах ReadBlock
. Похоже, вы видите, что читается ноль байтов, и просто предполагаете, что неизмененное содержимое буфера, которое вы видите, является еще одним чтением тех же данных.
Когда возвращаемая длина чтения меньше, чем запрашиваемая длина чтения, вы в конце. Вы также должны следить за длиной чтения в случае, если размер вашего потока не идеально соответствует размеру буфера, поэтому вам необходимо учитывать более короткую длину данных в вашем буфере.
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(len == buffer.Length);
Вы также можете проверить флаг EndOfStream
потока в вашем состоянии цикла. Я предпочитаю этот метод, так как вы не будете читать «0» (редкое условие, но это может произойти).
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(!stream.EndOfStream);