Тебе нужно асинхронное чтение потоков процесса, это можно сделать, добавив на колбек свой метод process.OutputDataReceived и ErrorDataReceived соответственно, а после process.Start() сразу запускаешь чтение потоков process.BeginOutputReadLine и BeginErrorReadLine
Вот
дока с примером
--------------upd---------------
Для чтения не по строкам, пользуйся асинхронным методом у StreamReader -
ReadBlockAsync
Чтобы можно было брать потоки process.StandardOutput и process.StandardError, у process.SystemInfo нужно установить RedirectStandardOutput = true и RedirectStandardError = true соответственно.
Осторожно, ReadBlockAsync может вернуть блок меньшего размера
Пример кодаusing System;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
namespace ProcessStdoutTaskTest
{
class MainClass
{
static char[] bufOut = new char[5];
static char[] bufErr = new char[5];
async static void ReadAsyncStream(StreamReader sr, char[] buf)
{
int size;
while ((size = await sr.ReadBlockAsync(buf, 0, buf.Length)) != 0)
{
Console.WriteLine((buf==bufOut?"out":"err")+" '" + new string(buf, 0, size) + "'") ;
}
}
public static void Main(string[] args)
{
using (Process process = new Process())
{
process.StartInfo.FileName = "/bin/bash";
process.StartInfo.Arguments = "-c \"printf 'abc';printf 'def' 1>&2;printf 'ghi';printf 'j' 1>&2;\"";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
ReadAsyncStream(process.StandardOutput, bufOut);
ReadAsyncStream(process.StandardError, bufErr);
Console.Write("Wait to process exit ");
process.WaitForExit();
Console.WriteLine("ok");
}
Console.WriteLine("Press enter to exit.");
Console.ReadLine();
}
}
}
Будет вывод:
Wait to process exit ok
Press enter to exit.
out 'abcgh'
out 'i'
err 'defj'
Кстати поведение объединения отдельных строк в потоках из разных кусочков не гарантируется, как я понимаю это зависит от того как использует flush на stdout запускаемый процесс, в моем примере это bash и он явно буферизирует вывод