В чем разница между вызовами Read() и ReadBlock() в TextReader?

Название более или менее говорит само за себя. Звонки документированы:

Здесь для TextReader.Read Method (Char[], Int32, Int32) а также
Здесь для TextReader.ReadBlock() с теми же типами аргументов.

Я хочу извлечь часть байтового массива, для которого я составляю MemoryStream что я намерен читать с StreamReader вот так:

    StreamReader r = new StreamReader(new MemoryStream(rawData, 0, 184, false, false));
    r.Read.....

Какой я должен использовать? Один из них быстрее или лучше?

1 ответ

Решение

Если вы можете сделать что-то полезное с частичным результатом, тогда вызовите Read() и поработайте над тем, что вы получите. В частности, если вы просматриваете и работаете с результатом каждого Read(), делайте это, а не с ReadBlock().

Слово "блок" в ReadBlock относится к действию блокировки, а не к следующему "блоку" байтов. Таким образом, он будет вынужден остановить дальнейшее выполнение до его завершения.

Если вы используете Reflector для просмотра реализации StreamReader.ReadBlock (которая унаследована от TextReader.ReadBlock), все, что он делает, это делает несколько вызовов метода "Read", пока либо метод "Read" не вернет 0, либо мы не прочитаем как много байтов по запросу. Это необходимо, потому что метод "Read" не обязательно вернет столько байтов, сколько вы просили.

Другие вопросы по тегам