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 efield 有什么用?这个怎么用?

4

3 回答 3

2

在您的事件处理程序中

object sender

是 Process 对象(顺便说一下,这是整个 .NET Framework 中非常常见的模式)

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

另请注意,您必须设置:

p.StartInfo.UseShellExecute = false;

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

于 2012-07-03T20:52:58.260 回答
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

于 2012-07-03T20:49:42.587 回答
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);
}
于 2012-07-03T21:00:18.893 回答