Почему StandardOutput.Read () блокирует когда для StartInfo.RedirectStandardInput установлено значение true?

Мне трудно расшифровать документ 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 не работает, когда используется:

  • с перенаправлением stdin; и,
  • читая что-то еще, кроме завершенных строк из stdout или stderr,

я решил попробовать напрямую использовать Windows API. Я добавил ответ с таким кодом; он работает нормально (по крайней мере, сейчас).

Еще одно обновление

Я создал запись в блоге с кодом, который я сейчас использую.

5
задан 30 August 2012 в 15:51
поделиться