Программа не завершается при использовании процессов
С помощью ProcessStartInfo
и Process
я хотел бы запустить программу (например, getdiff.exe), а затем считывает все выходные данные, которые производит программа. Позже я буду использовать данные более конструктивным образом, прямо сейчас я просто хочу распечатать данные, чтобы убедиться, что они работают. Однако программа не завершается должным образом. Кто-нибудь знает, почему? Спасибо заранее.
ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe");
psi.Arguments = "DIFF";
psi.UseShellExecute = false;
psi.RedirectStandardInput = true;
psi.WorkingDirectory = "c:\test";
Process p = Process.Start(psi);
string read = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Console.WriteLine(p);
Console.WriteLine("Complete");
p.Close();
Изменив программу на эту, она заработала правильно:
ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe");
psi.Arguments = "DIFF";
psi.UseShellExecute = false;
psi.RedirectStandardInput = true;
psi.WorkingDirectory = "c:\test";
Process p = Process.Start(psi);
StreamReader read = p.StandardOutput;
while (read.Peek() >= 0)
Console.WriteLine(read.ReadLine());
Console.WriteLine("Complete");
p.WaitForExit();
p.Close();
4 ответа:
MSDN предоставляет хороший пример , как можно перенаправить вход/выход процесса.
ReadToEnd()
не может правильно определить конец потока. В MSDN говорится:ReadToEnd предполагает, что поток знает, когда он достиг конца. Для интерактивных протоколов, в которых сервер отправляет данные только тогда, когда вы их запрашиваете, и не закрывает соединение, ReadToEnd может блокироваться на неопределенный срок и его следует избегать.
редактировать: Еще одна причина, чтобы избегайте
ReadToEnd()
: очень быстрый процесс вызовет исключение, потому что поток должен быть перенаправлен, прежде чем программа выведет какие-либо данные.
ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe"); psi.Arguments = "DIFF"; psi.UseShellExecute = false; psi.RedirectStandardInput = true; psi.WorkingDirectory = "c:\\test"; Process p = Process.Start(psi); StreamReader read = p.StandardOutput; while (read.Peek() >= 0) Console.WriteLine(read.ReadLine()); Console.WriteLine("Complete"); p.WaitForExit(); p.Close();