4
  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)、計算機を閉じた後でのみコードが続行されます。両方の計算機を連携させる必要があります。あなたはそれを行う方法を知っていますか?

4

2 に答える 2

1

ReadLine最初の計算の出力から読み取っています。Calcは出力を送信しません。したがって、ReadLine決して戻らないため、次の計算は開始されません。最初の計算が終了すると、最初の計算ReadLineから読み取ることができなくなるため、nullを返します。戻った後、コードは2番目の計算を開始できます。

最初の計算から読み取ることも、非同期で読み取ることもできません。非同期で読み取る方法については、 AsyncReadLineを参照することをお勧めします。

または、呼び出しを開始する前に、p2で2番目の計算を開始することもできますReadLine

于 2011-03-03T08:40:13.243 に答える
0

スレッドを使用してみませんか?

これを考慮してください:各計算をスレッドに入れてから、両方を開始します。その後、プログラムにそれらを待たせます。両方のスレッドがジョブ(データの読み取り)を完了した後でのみ、続行できます。

スレッドは別のスレッドからのデータを直接変更できないことを忘れないでください。必要に応じて、Invoke変数または静的変数の使用をお勧めします。

可能であれば、これを支援するためのいくつかの便利なメソッドがすでにあるタスク/並列ライブラリを利用できます。

バックグラウンドワーカーは行き過ぎです。

于 2011-03-03T19:32:22.923 に答える