ResGen.exe зависает при перенаправлении вывода - PullRequest
3 голосов
/ 20 марта 2011

Я пытаюсь перенаправить стандартный вывод из ResGen.exe.Я использую следующий код

ProcessStartInfo psi = new ProcessStartInfo( "resxGen.exe" );
psi.CreateNoWindow = true;
psi.Arguments = sb.ToString();
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
Process p = Process.Start( psi );
p.WaitForExit();
StreamReader sr = p.StandardOutput;
string message = p.StandardOutput.ReadToEnd();

Он застрял на p.WaitForExit.Когда я отключаю перенаправление потока вывода и не читаю StandardOutput, он работает правильно.

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 20 марта 2011

Вам нужно будет дождаться окончания процесса после чтения потока, в противном случае у вас в коде тупик. Проблема заключается в том, что ваш родительский процесс блокирует ожидание завершения дочернего процесса, а дочерний процесс ожидает, пока родительский процесс прочитает выходные данные, поэтому у вас есть тупик.

Здесь - хорошее и подробное описание проблемы.

Изменение вашего кода, как это должно избежать тупика:

StreamReader sr = p.StandardOutput;
string message = p.StandardOutput.ReadToEnd();
p.WaitForExit();
1 голос
/ 20 марта 2011

Суть в том, что размещение p.WaitForExit неверно;этот вызов метода должен выполняться только после чтения того, что вы хотите из потока.

С MSDN :

 // Start the child process.
 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();

Также обратите внимание, что вы используете StreamReader sr = p.StandardOutputздесь избыточно, поскольку, когда установлено значение message, вы получаете доступ к потоку, используя p.StandardOutput.ReadToEnd(); - обратите внимание на p.StandardOutput вместо sr.ReadToEnd().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...