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()
,