2013-07-10 19 views
6

W języku C# Rozpoczynam aplikację innej firmy, która zajmuje 2 - 3 godziny. Potrzebuję danych wyjściowych procesu, aby pisać na konsoli w czasie rzeczywistym. Zrobiłem badania na BeginOutputReadLine() i RedirectStandardOutput ze strony Microsoftu, ale mój kod nadal nie działa.C# Pokaż wyjście procesu w czasie rzeczywistym

Obecnie mój kod wyświetla dane wyjściowe dopiero po zakończeniu procesu. Nie wiem, gdzie poszło nie tak.

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 To nie jest to samo pytanie, ale tak, całkiem podobne. – feralin

+1

Jest to całkiem normalne, proces przełączy się na buforowane wyjście, gdy przekierujesz jego wyjście. Jeśli nie wypluje zbyt dużo tekstu, bufor nie zapełnia się wystarczająco, aby spowodować przepłukanie. Nic nie możesz z tym zrobić, jeśli nie możesz naprawić kodu programu. –

Odpowiedz

6

Linia

process.WaitForExit(); 

spowoduje aktualny program poczekać, aż zakończy się dany proces. To na pewno nie jest to, czego chcesz; prawdopodobnie chcesz rozpocząć proces, pozwól mu działać asynchronicznie, a następnie pozwól mu powiedzieć, kiedy to się skończy. W tym celu będziesz chciał użyć zdarzenia process.Exited.

+0

Po usunięciu procesu.WaitForExit(); konsola uruchamia proces w tle, a następnie zamyka, nadal nie pokazuje mi danych wyjściowych w czasie rzeczywistym. Czy dozwolony jest ciąg znaków z metody "OutputHandler"? – user2475310

2

Podobne do poprzedniego pytania Odpowiedziałem, może nawet duplikat. Patrz: Pipe a stream to Debug.Write()

Oto moja odpowiedź (nieco zmodyfikowany) z tego:

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

Następnie Twój obsługi zdarzeń do odbierania danych.

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

Zasadniczo wystarczy Nix WaitForExit(), ponieważ sprawia, że ​​Twój program powiesić na zakończenie procesu.

+1

Jakie poprzednie pytanie? Podaj link. A jeśli jest to po prostu regurgitacja tej odpowiedzi, twoja odpowiedź powinna być komentarzem, a nie odpowiedzią. –

+0

Dzięki za radę @ JimMischel, dodam link w mojej odpowiedzi. Przepraszam, jeśli moja odpowiedź nie jest właściwa, nadal często nie rozumiem, kiedy oznaczyć odpowiedzi i kiedy na nie odpowiedzieć. – Gray

Powiązane problemy