2012-07-03 44 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); 
}