Выполнить цепочку процессов - PullRequest
4 голосов
/ 02 марта 2011
  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 ]

1 голос
/ 03 марта 2011

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

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

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

0 голосов
/ 03 марта 2011

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

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

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

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

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

...