ResGen.exe зависает при перенаправлении вывода

Я пытаюсь перенаправить стандартный вывод из 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 ответа

Решение

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

Вот хорошее и подробное описание проблемы.

Такое изменение кода должно помочь избежать тупика:

StreamReader sr = p.StandardOutput;
string message = p.StandardOutput.ReadToEnd();
p.WaitForExit();

Суть в том, что размещение 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(),

Другие вопросы по тегам