C# 任务列表命令赢得';当RedirectStandardOutput为true时,t退出

C# 任务列表命令赢得';当RedirectStandardOutput为true时,t退出,c#,windows,cmd,process,C#,Windows,Cmd,Process,我正在尝试执行命令并等待它退出: Process proc = new Process(); proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = "/c tas

我正在尝试执行命令并等待它退出:

Process proc = new Process();

proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c tasklist";
proc.Start();

proc.WaitForExit();
return;
但是,如果
RedirectStandardOutput
设置为true,则不会退出
tasklist
命令

如果我将
RedirectStandardOutput
设置为false或将命令更改为
/c whoami
,它几乎会立即退出


有什么想法吗?

在调用
WaitForExit()
之前,您应该先阅读输出,此示例工作正常:

processproc=newprocess();
proc.StartInfo.UseShellExecute=false;
proc.StartInfo.RedirectStandardOutput=true;
proc.StartInfo.RedirectStandardError=true;
proc.StartInfo.FileName=“cmd.exe”;
proc.StartInfo.Arguments=“/c tasklist”;
proc.Start();
var output=proc.StandardOutput.ReadToEnd();
进程WaitForExit();
控制台写入线(输出);
返回;
在不读取输出的情况下,
tasklist
进程会等待父进程读取输出,如的备注部分所示

如果父进程调用
p.WaitForExit
before
p.StandardOutput.ReadToEnd
和子进程 写入足够的文本以填充重定向的流。父进程 将无限期地等待子进程退出。孩子 进程将无限期地等待父进程读取完整数据
标准输出

您还可以异步读取进程输出(并限制进程等待退出超时),如下所示

processproc=newprocess();
StringBuilder输出=新的StringBuilder();
proc.StartInfo.UseShellExecute=false;
proc.StartInfo.RedirectStandardOutput=true;
proc.StartInfo.RedirectStandardError=true;
proc.StartInfo.FileName=“cmd.exe”;
proc.StartInfo.Arguments=“/c tasklist”;
proc.OutputDataReceived+=(s,e)=>
{
output.Append(e.Data).Append(“\n”);
};
proc.ErrorDataReceived+=(s,e)=>
{
output.Append(e.Data).Append(“\n”);
};
proc.Start();
进程BeginOutputReadLine();
WaitForExit程序(100);
控制台写入线(输出);
返回;

此外,如果要重定向两个流(错误和输出),则至少异步读取了其中一个流,因为再次出现死锁(MSDN链接显示了一个示例)

Insert
console.WriteLine(proc.StandardOutput.ReadToEnd())介于
proc.Start()之间
proc.WaitForExit()@JosefZ添加ReadToEnd()成功。但是我还需要限制使用
proc.standardpoutput.read()
读取的最大字节数。如果我在
WaitForExit()
之前调用
Read()
,我将得到部分输出;如果我先执行
WaitForExit()
,它将被卡住