如何捕获在C#WPF应用程序后台运行的cmd行进程的输出?

如何捕获在C#WPF应用程序后台运行的cmd行进程的输出?,c#,redirect,command-line,output,C#,Redirect,Command Line,Output,我已经看过很多关于堆栈溢出(以及Internet的其他部分)的文章,它们都是在C#应用程序的背景下启动命令行进程的,但是所有的例子都在最后放了一个process.WaitForExit()命令 我的问题是,我需要在后台保持进程的活动状态,以便我的WPF应用程序可以与其通信(客户端/服务器样式)。我的代码成功地运行了这个过程,我的应用程序可以与之通信,但我似乎无法捕获任何输出 简化代码 在App.xaml.cs中: private Process hostApplication; private

我已经看过很多关于堆栈溢出(以及Internet的其他部分)的文章,它们都是在C#应用程序的背景下启动命令行进程的,但是所有的例子都在最后放了一个
process.WaitForExit()
命令

我的问题是,我需要在后台保持进程的活动状态,以便我的WPF应用程序可以与其通信(客户端/服务器样式)。我的代码成功地运行了这个过程,我的应用程序可以与之通信,但我似乎无法捕获任何输出

简化代码

App.xaml.cs
中:

private Process hostApplication;
private FileInfo hostApplicationFilename;
private void Application_Startup(object sender, StartupEventArgs e)
{
    // Start the command line process
    hostApplication = new Process();
    hostApplicationFilename = new FileInfo(@"C:\pretendpath\myEXE.exe");

    hostApplication.StartInfo.FileName = hostApplicationFilename.FullName;
    hostApplication.StartInfo.WorkingDirectory = hostApplicationFilename.DirectoryName;

    hostApplication.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    hostApplication.StartInfo.CreateNoWindow = true;

    hostApplication.StartInfo.UseShellExecute = false;
    hostApplication.StartInfo.RedirectStandardOutput = true;
    hostApplication.StartInfo.RedirectStandardError = true;
    hostApplication.StartInfo.RedirectStandardInput = true;

    hostApplication.OutputDataReceived += new DataReceivedEventHandler(HostApplicationOutputHandler);
    hostApplication.ErrorDataReceived += new DataReceivedEventHandler(HostApplicationOutputHandler);
    hostApplication.EnableRaisingEvents = true;

    hostApplication.Start();
    hostApplication.BeginOutputReadLine();
    hostApplication.BeginErrorReadLine();

    // Start the WPF's main window
    MainWindow view = new MainWindow();
    view.Show();
}

private void HostApplicationOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
    if (!String.IsNullOrEmpty(outLine.Data))
    {
        LocalHostApplicationLog = Environment.NewLine + outLine.Data;
#if (DEBUG)
        Console.WriteLine("HOST APPLICATION OUTPUT: " + outLine.Data);
#endif
    }
}
如果我在
DataReceivedEventHandler
中放置一个断点,它永远不会被命中


如有任何建议,将不胜感激

您可能应该创建一个新线程,在该线程中启动客户端进程,然后在该线程中执行waitforexit。我将上面所有与
hostApplication
相关的代码放在自己的线程中,并在最后添加了一个
hostApplication.WaitForExit()
。现在发生的是,一旦我关闭主窗口,DataReceiveDevenHandler中的断点就会被命中。一旦主窗口关闭,进程的所有输出都会立即转储。可能是客户端进程正在缓冲输出流-这是您可以控制的吗?如果你这样做了,你能在每次写入时刷新输出流吗?如果你对客户端进程没有任何控制权,重定向输出/错误流的另一种方法如你链接到的帖子中使用的方法所示,直到我尝试重定向输入。