我正在尝试在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
我想知道为什么会这样?
答案 0 :(得分:1)
我想知道为什么会这样?
您的循环运行速度比生成输出的速度快。一旦它通过输出,它就会结束,所以它永远不会看到第二行。
答案 1 :(得分:0)
在pChild输出文本之前,可能会执行Peek命令。当发生这种情况时,ch将为0并且while循环退出。