2012-09-20 129 views
3

我有一個C#程序,我想運行一個外部程序,當程序運行時,它需要讀取控制檯輸出並將其以JSON格式發送到服務器。這就是我的想法。它會起作用嗎?在程序運行時閱讀控制檯輸出c#

ProcessStartInfo psi = new ProcessStartInfo("app.exe"); 
psi.RedirectStandardOutput = true; 
psi.WindowStyle = ProcessWindowStyle.Hidden; 
psi.UseShellExecute = false; 
Process app = Process.Start(psi); 

while (true)// what do I loop on? 
{ 
    string line = "{ \"message\": \"" + app.StandardOutput.ReadLine() + "\" }"; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "/results/:" + runId + "/logs"); 
    request.ContentType = "text/json"; 
    request.Method = "POST"; 
    using (TextWriter tw = new StreamWriter(request.GetRequestStream())) 
    { 
     tw.WriteLine(line); 
    } 
} 
+0

好問題。你試過了嗎? 「它會起作用」是一個模糊的問題 - 我們可能需要更多關於您嘗試時會發生什麼的細節,以及您期望發生的事情。 –

回答

4

最好使用Process.OutputDataReceived事件Process類,不要阻止程序的執行,也不要運行while(true)循環內的代碼!

如果主程序只是有站立,等待該進程退出,可以做

Process app = Process.Start(psi); 
// read code, subscription to event described above, 
// and processing it inside event handler 

app.WaitForExit(); 
+0

謝謝,完美的工作! –

1

我反而會考慮將輸出窗口的重定向更改爲事件日誌甚至文本文件。然後,讓您的Web應用程序定期檢查事件日誌或文本文件,同時跟蹤其停止的位置,然後僅發送新結果。

+0

我會說相反。從直接訪問標準輸出的讀取比嘗試在兩個進程之間同步對文本文件的訪問好得多。 – Servy

2

嘗試是這樣的:

ProcessStartInfo psi = new ProcessStartInfo("app.exe"); 
psi.RedirectStandardOutput = true; 
psi.WindowStyle = ProcessWindowStyle.Hidden; 
psi.UseShellExecute = false; 
Process app = Process.Start(psi); 

StreamReader reader = app.StandardOutput; 

do 
{ 
    string line = "{ \"message\": \"" + reader.ReadLine() + "\" }"; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "/results/:" + runId + "/logs"); 
    request.ContentType = "text/json"; 
    request.Method = "POST"; 
    using (TextWriter tw = new StreamWriter(request.GetRequestStream())) 
    { 
     tw.WriteLine(line); 
    } 

}while(!reader.EndOfStream); 

app.WaitForExit();