Программа не завершается при использовании процессов


С помощью 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 2

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

Не уверен, связано ли это, но вы делаете psi.RedirectStandardInput = true;, не делая ничего с результирующим потоком. Может быть, каким-то образом приложение требует, чтобы входной поток был "закрыт" перед его выходом? Так что попробуйте myProcess.StandardInput.Close().

Попробуйте вместо этого этот код,

P. CloseMainWindow ()