如何捕获在C#WPF应用程序后台运行的cmd行进程的输出?
我已经看过很多关于堆栈溢出(以及Internet的其他部分)的文章,它们都是在C#应用程序的背景下启动命令行进程的,但是所有的例子都在最后放了一个如何捕获在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
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中的断点就会被命中。一旦主窗口关闭,进程的所有输出都会立即转储。可能是客户端进程正在缓冲输出流-这是您可以控制的吗?如果你这样做了,你能在每次写入时刷新输出流吗?如果你对客户端进程没有任何控制权,重定向输出/错误流的另一种方法如你链接到的帖子中使用的方法所示,直到我尝试重定向输入。