1

我正在尝试在 C# 程序(例如 cmd)中创建一个子进程并使用进程 IO 流执行读/写。我正在使用 StandardOutput.Read() 方法来读取进程输出。

当我在 Read() 之前放置一个 Thread.Sleep() 方法时,它会提供完整的输出,但如果我删除它,它只会显示单行输出。

这是代码:

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]
版权所有 (c) 2009 Microsoft Corporation。版权所有。

D:\ProcessDemo_001\bin\Release>退出

禁用睡眠的输出:

Microsoft Windows [版本 6.1.7601] 退出

我想知道为什么会这样?

4

2 回答 2

1

我想知道为什么会这样?

您的循环运行速度比产生输出的速度快。一旦它通过输出,它就会结束,所以它永远不会看到第二行。

于 2012-12-13T19:35:57.777 回答
0

在 pChild 输出文本之前执行 Peek 命令可能会发生。发生这种情况时,ch 将为 0 并且 while 循环退出。

于 2012-12-13T19:37:59.393 回答