Мне трудно расшифровать документ MSDN о Process.StandardOutpout относительно того, если Read (Char [], Int32, Int32) или нет. Я понимаю, что он не должен блокироваться, но похоже, что это так, когда я устанавливаю RedirectStandardInput в значение true.
Есть ли у кого-нибудь опыт работы с этим; или какое-то объяснение проблемы, с которой я столкнулся?
Контекст здесь таков, что я не хочу ждать полной строки (т.е. с символом конца строки) или завершения процесса перед чтением стандартного вывода. Также я не хочу использовать обратные вызовы. Я хочу читать StdOut синхронно по мере того, как процесс записывает в него.
Вот упрощенная версия моего кода:
string command = @"C:\flex_sdks\flex_sdk_4.5.1.21328\bin\fcsh.exe";
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = false; # <-- if I set this to true, then
# the program hangs on
# p.StandardOutput.Read later on
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = command;
p.Start();
StringBuilder sb_stdout = new StringBuilder(1024);
char[] buffer = new char[64];
int nb_bytes_read;
while (true) {
do {
nb_bytes_read = p.StandardOutput.Read(buffer, 0, buffer.Length);
sb_stdout.Append(new string(buffer, 0, nb_bytes_read));
} while (nb_bytes_read > 0);
if (sb_stdout.ToString().EndsWith("\n(fcsh) "))
break;
Thread.Sleep(20);
}
На основе моего (вероятно, плохого) предположения, что Process.StandardOutput не работает, когда используется:
я решил попробовать напрямую использовать Windows API. Я добавил ответ с таким кодом; он работает нормально (по крайней мере, сейчас).
Я создал запись в блоге с кодом, который я сейчас использую.