1

C# プログラム (cmd など) でサブプロセスを作成し、プロセス IO ストリームで読み取り/書き込みを実行しようとしています。プロセス出力を読み取るために StandardOutput.Read() メソッドを使用しています。

Read() の前に Thread.Sleep() メソッドを配置すると、完全な出力が得られますが、削除すると、1 行の出力しか表示されません。

コードは次のとおりです。

string sProcess = "cmd.exe";
ProcessStartInfo psiInfo = new ProcessStartInfo();
psiInfo.FileName = sProcess;
psiInfo.CreateNoWindow = true;
psiInfo.UseShellExecute = false;
psiInfo.RedirectStandardOutput = true;
psiInfo.RedirectStandardError = true;
psiInfo.RedirectStandardInput = true;
Process pChild = new Process();
pChild.StartInfo = psiInfo;
if (pChild.Start())
{
    int ch;
    do
    {
        Thread.Sleep(50);
        ch = pChild.StandardOutput.Peek();
        if (ch > 0)
            Console.Write((char)pChild.StandardOutput.Read());
    } while (ch > 0);
    Console.WriteLine("exit");
    pChild.StandardInput.WriteLine("exit");
}

スリープを有効にした出力:

Microsoft Windows [バージョン 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. 全著作権所有。

D:\ProcessDemo_001\bin\Release>終了

スリープを無効にした出力:

Microsoft Windows [バージョン 6.1.7601] 終了

なぜこれが起こるのか知りたいですか?

4

2 に答える 2

1

なぜこれが起こるのか知りたいですか?

あなたのループは、出力が生成されるよりも速く実行されています。出力を通過するとすぐに終了するため、2 行目は表示されません。

于 2012-12-13T19:35:57.777 に答える
0

pChildがテキストを出力する前に、Peekコマンドが実行される場合があります。その場合、chは0になり、whileループは終了します。

于 2012-12-13T19:37:59.393 に答える