Execute Process Chain

只愿长相守 提交于 2019-12-19 09:09:26

问题


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

    }

I am trying to execute "calc|calc" but when I do so , it gets stuck at the line while ((s = sr.ReadLine()) != null) and only after I close the calculator the code continues. I need both calculators to work together. do you have idea how to do that?


回答1:


ReadLine is reading from the output of the first calc. Calc doesn't send any output. So, ReadLine will never return and thus the next calc will not start. When the first calc terminates, ReadLine can no longer read from the first calc, so returns null. After it has returned, the code can start the second calc.

You can either not read from the first calc or read asynchronously. You might want to refer to Async ReadLine on how to read asynchronously.

You could alternatively start the second calc with p2 before you start calling ReadLine.




回答2:


Why not use threading?

Consider this: Put each calc into a thread and then start them both. After that make the program wait for them. Only after both threads are done with their jobs (read data) then you can continue.

Remember that threads cannot directly alter data from another thread so I might suggest the use of Invoke or static variables, depending on what you might need.

If possible, you can make use of Task/Parallel library which already have some useful methods to help you on this.

Background Worker is too a way to go.



来源:https://stackoverflow.com/questions/5170273/execute-process-chain

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!