2012-07-03 114 views
0

我有一个控制台应用程序,我正在从我的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

*我不想使这一过程物P作为类的字段* - 为什么不呢? – DaveShaw

+1

@DaveShaw:没有理由这样做。事件处理程序已经将回发过程对象作为'sender'参数。没有理由将这些信息保留在多余的地方。 –

+0

@DaveShaw,我不想这样做,因为在我的实现中,我有一个进程数组。如果我成为这个班的一个领域,事情会变得复杂一些。 – Venom

回答

2

在事件处理

object sender 

是Process对象(也就是顺便说一个很常见的模式在整个.NET框架)

Process originalProcess = sender as Process; 
Console.WriteLine("log: {0}", originalProcess.StandardOutput.ReadToEnd()); 

还请注意,你必须设置:

p.StartInfo.UseShellExecute = false; 

在您的进程中使用IO重定向。

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

+0

“myProcess_Exited”中的** p **是什么? – Venom

+0

@Venom:查看我编辑的帖子。 – Tigran

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); 
}