问题
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