Не могу получить от ProcessStartInfo вывод когда "вызываю" цикличискую программу

Не могу получить от ProcessStartInfo вывод когда "вызываю" цикличискую программу. Не получается ПроцессСтартом получить вывод результата.

Потоком ProcessStartInfo хочу получить вывод как в примере:

dima@komp:~/mita/TCP_IP$ ping www.ya.ru
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=52 time=13.2 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=52 time=12.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=52 time=16.1 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=4 ttl=52 time=12.7 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=5 ttl=52 time=12.6 ms
^C64 bytes from ya.ru (87.250.250.242): icmp_seq=6 ttl=52 time=17.6 ms
^Z
[2]+  Остановлен    ping www.ya.ru
dima@komp:~/mita/TCP_IP$ 

Для этого написал такую программку :

using System;
using System.IO;
using System.Diagnostics;

    public class Test
    {
      public static void Main()
      {
        // создаем процесс cmd.exe с параметрами "ipconfig /all"
        //ProcessStartInfo psiOpt = new ProcessStartInfo("ifconfig");
        ProcessStartInfo psiOpt = new ProcessStartInfo("ping"); // не работает но ошибку не даёт
        //ProcessStartInfo psiOpt = new ProcessStartInfo("mono"); 
        // скрываем окно запущенного процесса
        psiOpt.WindowStyle = ProcessWindowStyle.Hidden;
        // передаём аргументы 
        psiOpt.Arguments = "www.ya.ru";// не работает но ошибку не даёт
        //psiOpt.Arguments = "tehn.exe";
        // настраиваем процесс
        psiOpt.RedirectStandardOutput = true;
        psiOpt.UseShellExecute = false;
        psiOpt.CreateNoWindow = true;
        // запускаем процесс
        Process procCommand = Process.Start(psiOpt);
        for (; ; )
        {
            // получаем ответ запущенного процесса
            StreamReader srIncoming = procCommand.StandardOutput;
            // выводим результат
            Console.WriteLine(srIncoming.ReadToEnd());
        }
            // закрываем процесс
        procCommand.WaitForExit();
        // вводим одну клавишу и закрываем программу 
        Console.ReadKey();
      }
    }

Но увы результат работы программы меня совершенно не устроил :

dima@komp:~/mita/TCP_IP$ mcs lovla_terminal3.cs 
lovla_terminal3.cs(32,9): warning CS0162: Unreachable code detected
Compilation succeeded - 1 warning(s)
dima@komp:~/mita/TCP_IP$ mono lovla_terminal3.exe 
zx
xz
cxzc
^C
dima@komp:~/mita/TCP_IP$

Как я понял, я упускаю важный момент вывода потока StreamReader-а потому как я заметил поток ProcessStartInfo выводит после исполнения вызванной программы, для решения этой проблеммы я добавил вечный цикл for(;;). Увы это не дало результата.


Ответы (1 шт):

Автор решения: timob256

Спасибо @rdorn

Я адаптировал ваш ответ к моему вопросу

using System;
using System.IO;
using System.Diagnostics;

    public class Test
    {
      public static void Main()
      {
        // оформляем процесс 
        ProcessStartInfo startInfo = new ProcessStartInfo()
        {
            FileName = "ping", // имя запускаемого процесса
            Arguments = "www.ya.ru", // аргументы процесса
            // настройки что именно от процесса " получать "
            RedirectStandardOutput = true, 
            UseShellExecute = false,
            CreateNoWindow = true
        };
        // Какая то неизвестная для меня конструкция , увы так и не понял 
        // как она работает, по этому расписал как вижу :3 
        using (Process sevenZip = new Process())
        {
            // Думаю что соразмерно  Process sevenZip = Process.Start(startInfo);
            sevenZip.StartInfo = startInfo;
            // Настраиваем приём данных (сообщений) от запущенного процесса 
            // совершенно непонятно как это работает
            // ибо OutputDataReceived это System.Diagnostics.DataReceivedEventHandler 
            // да и символ += сложно (в общем не "функциональное погромирование")
            sevenZip.OutputDataReceived += proc_OutputDataReceived;
            // запускаем процесс
            sevenZip.Start();
            //получаем ответ запущенного процесса
            sevenZip.BeginOutputReadLine();
            // закрываем процесс
            sevenZip.WaitForExit();
        }
    }
    private static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        // Вывод в консоль принятых аргументов
        Console.WriteLine(e.Data);
        // также пишем полученные данные в лог файл 
        using (var wr = File.AppendText("log.txt"))
            wr.WriteLine(e.Data);
    }
}

Вот вывод :

dima@komp:~/mita/TCP_IP$ mcs lovla_terminal4.cs 
dima@komp:~/mita/TCP_IP$ mono lovla_terminal4.exe 
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=52 time=12.3 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=52 time=13.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=52 time=12.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=4 ttl=52 time=12.7 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=5 ttl=52 time=14.0 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=6 ttl=52 time=12.5 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=7 ttl=52 time=12.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=8 ttl=52 time=12.5 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=9 ttl=52 time=13.7 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=10 ttl=52 time=12.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=11 ttl=52 time=15.7 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=12 ttl=52 time=12.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=13 ttl=52 time=12.6 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=14 ttl=52 time=16.8 ms
^Z
[1]+  Остановлен    mono lovla_terminal4.exe
dima@komp:~/mita/TCP_IP$

Но увы так и не понял в истинном смысле как это работает ;_;

→ Ссылка