Выполнить цепочку процессов

  public void ExecuteProcessChain(string[] asProcesses, string sInRedirect, string sOutRedirect)
    {
            Process p1 = new Process();
            p1.StartInfo.UseShellExecute = false;
            p1.StartInfo.RedirectStandardOutput = true;
            p1.StartInfo.FileName = asProcesses[0];
            p1.Start();
            StreamReader sr = p1.StandardOutput;
            string s, xxx = "";
            while ((s = sr.ReadLine()) != null)
                Console.WriteLine("sdfdsfs");
                //xxx += s+"\n";
            p1.StartInfo.RedirectStandardInput = true;
            p1.StartInfo.RedirectStandardOutput = false;
            p1.StartInfo.FileName = asProcesses[1];
            p1.Start();
            StreamWriter sw = p1.StandardInput;
            sw.Write(xxx);
            sw.Close();
            sr.Close();

    }

Я пытаюсь выполнить "calc|calc", но когда я это делаю, он застревает на линии while ((s = sr.ReadLine()) != null) и только после закрытия калькулятора код продолжается. Мне нужны оба калькулятора для совместной работы. у тебя есть идеи как это сделать?

2 ответа

ReadLine читает с выхода первого калька. Calc не отправляет вывод. Так, ReadLine никогда не вернется и, следовательно, следующий calc не начнется. Когда первый calc заканчивается, ReadLine больше не может читать с первого calc, поэтому возвращает null. После того, как он вернулся, код может запустить второй calc.

Вы можете либо не читать с первого calc, либо читать асинхронно. Возможно, вы захотите обратиться к Async ReadLine о том, как читать асинхронно.

В качестве альтернативы вы можете начать второй calc с p2 до того, как начнете вызывать ReadLine,

Почему бы не использовать многопоточность?

Учтите это: поместите каждый calc в поток, а затем запустите оба. После этого заставьте программу ждать их. Только после того, как оба потока выполнят свои задания (чтение данных), вы сможете продолжить.

Помните, что потоки не могут напрямую изменять данные из другого потока, поэтому я мог бы предложить использовать Invoke или статические переменные, в зависимости от того, что вам может понадобиться.

Если возможно, вы можете использовать библиотеку Task/Parallel, в которой уже есть несколько полезных методов, которые помогут вам в этом.

Background Worker - это тоже путь.

Другие вопросы по тегам