2012-07-03 2 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

* Я не хочу, чтобы объект процесса р как поле класса * - Почему нет.? – DaveShaw

+1

@DaveShaw: Нет причин для этого. Обработчик событий уже отправит объект процесса в качестве параметра 'sender'. Нет причин держать эту информацию в избыточном месте. –

+0

@DaveShaw, я не хотел этого делать, потому что в моей реализации у меня есть массив процессов. И если я сделаю это поле этого класса, все станет немного сложнее. – Venom

ответ

2

В обработчике событий

object sender 

является объектом процесса (что является довольно общий шаблон, кстати по всей .NET Framework)

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

Заметим также, что вы должны установить:

p.StartInfo.UseShellExecute = false; 

использовать перенаправление ввода-вывода в вашем процессе.

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

Что такое ** p ** в 'myProcess_Exited'? – 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); 
} 
Смежные вопросы