Вы видите эффект буфера вывода stdout, который использует программа. Это стандартная функция библиотеки времени выполнения C, буферизация включается, когда она обнаруживает, что пишет в канал, а не в консоль. Вместо автоматической очистки после каждого оператора printf () в программе. Размер буфера обычно составляет около 2 килобайт. И вспыхивает только тогда, когда он заполняется. Это значительно повышает эффективность, промывка каждый раз добавляет много накладных расходов. Важно в нормальных сценариях перенаправления, когда вывод записывается в файл или устройство.
Вы можете видеть, куда это идет, сгустки, которые вы видите, являются содержимым этого буфера. Простого решения этой проблемы не существует, в программе требуется операция, чтобы отключить буфер или очистить его там, где это важно. Это всегда, где доллар останавливается, вы не будете делать это, если вы могли бы изменить программу. Вы могли бы подавать консоль с помощью буфера, буферизуя то, что вы получаете из OutputDataReceived, но, возможно, это немного глупо.
Вы не увидите этого эффекта, когда программа отправляет вывод быстрее, чем вы можете его обработать. Что довольно распространено. Он эффективно блокируется, блокируется при ожидании освобождения выходного буфера и быстро заполняет его.
Для этого есть еще одно объяснение: скорость, с которой может работать OutputReceived, зависит также от того, сколько потоков потоков у вас запущено. Если это больше, чем количество ядер процессора, поток tp, который вызывает OutputReceived, может быть задержан кратно 0,5 секунды. Однако вы бы увидели скопление всех программ, которые вы перенаправили.