在Process.StandardOutput.Read()方法之前是否需要睡眠?

时间:2012-12-13 19:33:45

标签: c#

我正在尝试在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 [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

D:\ProcessDemo_001\bin\Release>exit 

禁用睡眠时的输出:

Microsoft Windows [Version 6.1.7601]exit

我想知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

  

我想知道为什么会这样?

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

答案 1 :(得分:0)

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