我有一个控制台应用程序,我是从我的C#程序运行的过程 当这个进程终止时,我已经调用了一个事件处理程序 如何在事件处理程序中打印此过程的标准输出。 基本上,如何在事件处理程序中访问进程的属性? 我的代码如下所示。
public void myFunc()
{
.
.
Process p = new Process();
p.StartInfo.FileName = "myProgram.exe";
p.StartInfo.RedirectStandardOutput = true;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(myProcess_Exited);
p.Start();
.
.
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine("log: {0}", <what should be here?>);
}
我不想将过程对象p作为类的一个字段。
另外,System.EventArgs e
字段有什么用?怎么能用呢?
答案 0 :(得分:2)
在您的事件处理程序
中object sender
是Process对象(这是整个.NET Framework中非常常见的模式)
Process originalProcess = sender as Process;
Console.WriteLine("log: {0}", originalProcess.StandardOutput.ReadToEnd());
另请注意,您必须设置:
p.StartInfo.UseShellExecute = false;
在Process中使用IO重定向。
答案 1 :(得分:1)
像这样使用:
private void myProcess_Exited(object sender, System.EventArgs e)
{
Process pro = sender as Process;
string output = pro.StandardOutput.ReadToEnd()
Console.WriteLine("log: {0}", output);
}
标准输出只不过是StreamReader。
答案 2 :(得分:1)
一种选择是在封闭中捕获它:
public void myFunc()
{
Process p = new Process();
p.StartInfo.FileName = "myProgram.exe";
p.StartInfo.RedirectStandardOutput = true;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler((sender, args) => processExited(p));
p.Start();
}
private void processExited(Process p)
{
Console.WriteLine(p.ExitTime);
}