Próbuję przechwycić dane wyjściowe procesu w czasie rzeczywistym (podczas działania). Kod, którego używam, jest raczej prosty (patrz poniżej). Z jakiegoś dziwnego powodu zdarzenie OutputDataReceived nigdy nie jest wywoływane. Czemu?Przechwytywanie danych wyjściowych procesu za pomocą zdarzenia OutputDataReceived
private void button2_Click(object sender, EventArgs e)
{
// Setup the process start info
var processStartInfo = new ProcessStartInfo("ping.exe", "-t -n 3 192.168.100.1")
{
UseShellExecute = false,
RedirectStandardOutput = true
};
// Setup the process
mProcess = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true };
// Register event
mProcess.OutputDataReceived += OnOutputDataReceived;
// Start process
mProcess.Start();
mProcess.WaitForExit();
}
void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
{
//Never gets called...
}
Ponadto Proces zewnętrzne jest wymagane opróżnić swój bufor wyjściowy w momencie wyprowadza coś. Bez płukania bufor wyjściowy może trwać do momentu zakończenia procesu zewnętrznego; to sprawia, że główna aplikacja nie może przechwycić wyjścia "na żywo". –
@BobKruithof: To prawda. Zewnętrzny proces musi faktycznie wysłać dane, ale bez żadnych innych informacji najłatwiej jest zadać pytanie. :) – Chris
Również niektóre aplikacje zapisują do standardowego ERROR zamiast standardowego OUTPUT. Zwykle nie można zrobić różnicy, patrząc ręcznie na wynik. Tak więc, spróbuj dodać na wszelki wypadek: odpowiednio "RedirectStandardError = true" i "mProcess.BeginErrorReadLine();". – altumano