C# 为什么在重定向标准输出时TaskList.exe永远不会结束?

C# 为什么在重定向标准输出时TaskList.exe永远不会结束?,c#,windows,process,freeze,tasklist,C#,Windows,Process,Freeze,Tasklist,当我尝试使用Process类运行tasklist.exe并将RedirectStandardOutput设置为true时,该过程永远不会结束 using System.Diagnostics; class Program { static void Main(string[] args) { RunProcess("tasklist.exe"); } private static void RunProcess(string command)

当我尝试使用Process类运行tasklist.exe并将RedirectStandardOutput设置为true时,该过程永远不会结束

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        RunProcess("tasklist.exe");
    }

    private static void RunProcess(string command)
    {
        var process = new Process()
        {
            StartInfo =
            {
                FileName = command,
                RedirectStandardOutput = true,
                UseShellExecute = false
            }
        };

        process.Start();
        process.WaitForExit();
    }
}
如果我将RedirectStandardOutput设置为false,则该过程将结束

为什么tasklist.exe进程从未结束?我使用的是Windows7和.NETFramework 4.5.2


我发现,当我强制关闭tasklist.exe时,每次都有4096字节写入标准输出!是否需要增加某种字符缓冲区的大小?

如果使用的是
RedirectStandardOutput=true
请在代码中添加以下行:

process.Start();

// To avoid deadlocks, always read the output stream first and then wait.
string out = process.StandardOutput.ReadToEnd();

process.WaitForExit();

如果使用的是
RedirectStandardOutput=true
请将此行添加到代码中:

process.Start();

// To avoid deadlocks, always read the output stream first and then wait.
string out = process.StandardOutput.ReadToEnd();

process.WaitForExit();

你不看输出,这有什么关系?真的。缓冲区已满,因此进程对标准输出的写入将被阻止。读取缓冲区以允许进程继续。缓冲区已满,因此tasklist.exe会在完成写入之前阻止您读取。您需要在WaitForExit之前读取。请参阅此处关于死锁的讨论:您不阅读输出..为什么这很重要?确实如此。缓冲区已满,因此进程对标准输出的写入将被阻止。读取缓冲区以允许进程继续。缓冲区已满,因此tasklist.exe会在完成写入之前阻止您读取。您需要在WaitForExit之前读取。请参阅此处关于死锁的讨论:我认为您的意思是使用StandardOutput而不是StandardError,但这确实有效!谢谢你,吕本;)我想你的意思是使用StandardOutput而不是StandardError,但这是可行的!谢谢你,吕本;)