Мне нужно читать, какие данные запущенный мною процесс пишет в выходной поток. Для этого при запуске процесса, в ProcessStartInfo я устанавливаю перенаправление выходного потока (к слову всех потоков, но это не так важно).
У объекта process.StandardOutput имеются два метода Read и ReadBlock, второй как я выяснил производит блокировку, но тем не менее в документации про нее ничего не написано. Первый же метод, это то что мне нужно, но я не понимаю как он работает.
Я его использую следующим образом:
int next = 0;
do
{
int realReaded = process.StandardOutput.Read(buffer, 0, buffer.Length);
Console.Write(buffer, 0, realReaded);
next = process.StandardOutput.Peek();
} while (next != -1);
Используемая перегрузка Read должна возвращать количество реально прочитанных символов, либо ноль, если их нет. (то есть по идее даже Peek не нужен). Проблема в том, что когда данных нет - он производит блокировку. Окей, для этого казалось бы можно использовать Peek. Если данных больше чем размер буфера, то он заполнится и метод выдаст число символов равное размеру массива. Да! Тут все работает. Но, если количество символов меньше чем размер буфера, то он должен заполнить его не полностью, а вернуть реально заполненное число символов? Если конкретнее говорить, то вот более уточненная постановка моего вопроса.
Из моих наблюдений оно работает -
по разному. Например, если у меня буфер 256 символов - в него все помещается и я за раз получаю все символы, которые процесс должен записать при запуске.
Но вот если буфер в 10 символов, то все работает ровно до последней порции данных - в нее вроде бы и должны входить символы, но метод блокируется и я не могу их прочитать. Причем число символов не кратно 10, это я проверил с помощью дебаггера посмотрев сколько символов считывается при буфере в 256 символов. С буфером в 50 символов тоже самое.
Можно было бы в теории использовать буфер в 256 символов, но потом и с этим буфером продолжается проблема - он блокируется, если данных в потоке меньше чем размер буфера.
Согласно документации этот метод не должен блокировать процесс в ожидании данных. Мне кажется я не лезу в какие-то дебри, это должны быть весьма часто-используемые механизмы, а моему некоторому возмущению по поводу работы этого метода, есть вполне логичное объяснение. Подскажите, пожалуйста, где я ошибся в использовании этого метода или может ссылку на статью, где описывается как правильно организовывать взаимодействие с запущенным процессом по стандартным потокам.