2012-09-20 90 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();