C# 将子进程输出重定向到父进程';使用DataReceivedEventHandler的s控制台

C# 将子进程输出重定向到父进程';使用DataReceivedEventHandler的s控制台,c#,process,C#,Process,我有一个单独的主机进程,负责启动多个子进程。我想将每个子进程的日志消息打印到一个文件中,并打印到主机进程的主控制台窗口中 每个子进程的ProcessStartInfo如下所示: psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.ErrorDialog = false; psi.RedirectStandardInput = true; psi.RedirectStandardError = true; psi.Redirect

我有一个单独的主机进程,负责启动多个子进程。我想将每个子进程的日志消息打印到一个文件中,并打印到主机进程的主控制台窗口中

每个子进程的ProcessStartInfo如下所示:

psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.ErrorDialog = false;
psi.RedirectStandardInput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;
process.OutputDataReceived += (s, e) =>
        {
            File.AppendAllLines(filepath, new string[] { e.Data });
            Console.WriteLine(e.Data);
        }
然后,我为子进程设置以下内容:

psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.ErrorDialog = false;
psi.RedirectStandardInput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;
process.OutputDataReceived += (s, e) =>
        {
            File.AppendAllLines(filepath, new string[] { e.Data });
            Console.WriteLine(e.Data);
        }
最后开始这个过程:

process.StartInfo = psi;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

这非常适合将消息写入日志文件,但无论我尝试什么,它都不会在控制台窗口中输出消息。我已尝试按照其他地方的建议刷新控制台,但没有任何帮助(console.Out.Flush())。

如果我单步执行代码,控制台的标题是正确的,但如果我从OutputDataReceived事件调用console.Clear(),则会出现“无效句柄”错误。因此,也许我需要严格地引用来自父级的控制台?我假设它会冒泡。如果您从Console.Clear()获得异常,那么您就没有控制台。因此,您也无法看到Console.Write()输出。我猜有人将不得不停止使用CreateNoWindow=true。父进程是否在子进程之前退出?过程。开始。。方法是异步的,用于不阻塞,所以如何阻止父进程完成?您正在使用Process.WaitForExit()?正确,我正在使用Process.WaitForExit。请注意,父进程仍然正确地在命令窗口中记录信息(例如,当我按“enter”时,它将关闭所有子进程并在控制台中显示此信息)。