Программа не завершается при использовании процессов - PullRequest
2 голосов
/ 21 июня 2011

Используя 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 ]

3 голосов
/ 21 июня 2011

MSDN предоставляет хороший пример , как можно перенаправить ввод / вывод процесса. ReadToEnd() не может правильно определить конец потока. MSDN говорит :

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

EDIT: Другая причина избегать ReadToEnd(): очень быстрый процесс вызовет исключение, потому что поток должен быть перенаправлен ПЕРЕД тем, как программа выводит какие-либо данные.

2 голосов
/ 21 июня 2011
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();
1 голос
/ 21 июня 2011

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

0 голосов
/ 21 июня 2011

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

p.CloseMainWindow ()

...