2013-07-10 11 views
6

In C# Sto avviando un'applicazione di terze parti che richiede 2-3 ore per essere completata. Ho bisogno dell'output del processo per scrivere sulla console in tempo reale. Ho effettuato ricerche su BeginOutputReadLine() e RedirectStandardOutput dal sito Web di Microsoft, ma il mio codice non funziona ancora.C# Mostra l'output del processo in tempo reale

Attualmente il mio codice mostra solo l'output al termine del processo. Non so dove sia andato storto.

static void Main(string[] args) 
{ 
    Process process; 
    process = new Process(); 
    process.StartInfo.FileName = "C:\\ffmbc\\ffmbc.exe"; 
    process.StartInfo.Arguments = "-i \\\\dssp-isi-t\\TMD\\B002C010_130520_R2R7.2398v5.mxf -an -vcodec libx264 -level 4.1 -preset veryslow -tune film -x264opts bluray-compat=1:weightp=0:bframes=3:nal-hrd=vbr:vbv-maxrate=40000:vbv-bufsize=30000:keyint=24:b-pyramid=strict:slices=4:aud=1:colorprim=bt709:transfer=bt709:colormatrix=bt709:sar=1/1:ref=4 -b 30M -bt 30M -threads 0 -pass 1 -y \\\\dss-isi-t\\MTPO_Transfer\\dbay\\B002C010_130520_R2R7.2398v5.mxf.h264"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler); 
    process.StartInfo.RedirectStandardInput = true; 
    process.Start(); 
    process.BeginOutputReadLine(); 
    process.WaitForExit(); 
    process.Close(); 
} 

private static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) 
{ 
    string line; 
    line = (outLine.Data.ToString()); 
    Console.WriteLine(line); 
} 
+0

@Xeano Non esattamente la stessa domanda, ma sì, molto simile. – feralin

+1

Questo è abbastanza normale, il processo passerà all'output bufferizzato quando si reindirizza l'output. Se non sputa molto un testo, quel buffer non si riempie abbastanza da causare il flush. Nulla che puoi fare se non riesci a correggere il codice del programma. –

risposta

6

La linea

process.WaitForExit(); 

farà sì che il programma in corso di aspettare fino a quando il processo di data termina. Questo non è certamente ciò che vuoi; probabilmente vorrai avviare il processo, lasciarlo girare in modo asincrono e poi lasciare che ti dica quando finisce. Per questo, ti consigliamo di utilizzare l'evento process.Exited.

+0

Quando rimuovo process.WaitForExit(); la console esegue il processo in background e poi si chiude, non mi mostra ancora un output in tempo reale. Sono autorizzato una stringa dal metodo 'OutputHandler'? – user2475310

2

Simile a una domanda precedente avevo risposto, forse anche un duplicato. Vedi: Pipe a stream to Debug.Write()

Ecco la mia risposta (leggermente modificato) da quello:

process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.OutputDataReceived += p_OutputDataReceived; 
process.Start(); 
process.BeginOutputReadLine(); 

Poi, il gestore di eventi per la ricezione dei dati.

void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.Write(e.Data); 
} 

In sostanza, non vi resta che nix la WaitForExit(), dal momento che rende il vostro programma di appendere fino al completamento del processo.

+1

Quale domanda precedente? Fornire un collegamento. E se questo è solo un rigurgito di quella risposta, la tua risposta dovrebbe essere un commento, non una risposta. –

+0

Grazie per il consiglio @JimMischel, aggiungerò un link nella mia risposta. Scusate se la mia risposta non è appropriata, sono ancora spesso confuso su quando segnalare le risposte e quando rispondere. – Gray

Problemi correlati