2012-05-24 52 views
0

我有一个控制台应用程序,我想在c#应用程序中处理std。流程执行期间重定向标准输出不刷新

基本上我已经成功使用此代码做到这一点:

Process ProcessObj = new Process(); 

ProcessObj.StartInfo.WorkingDirectory = WorkingPath; 
ProcessObj.StartInfo.FileName = ApplicationPath; 
ProcessObj.StartInfo.Arguments = ApplicationArguments; 

ProcessObj.StartInfo.UseShellExecute = false; 
ProcessObj.StartInfo.CreateNoWindow = true; 

ProcessObj.StartInfo.RedirectStandardOutput = true; 

// Start the process 
ProcessObj.Start(); 

// loop through until the job is done 
bool stopper = false; 
while (!stopper) 
{ 
    stopper = ProcessObj.WaitForExit(100); 

    string line = null; 

    // handle normal outputs (loop through the lines) 
    while (true) 
    { 
     line = ProcessObj.StandardOutput.ReadLine(); 
     if (line == null) 
      break; 

     Logger.Trace("Out: \"" + line + "\""); 
    } 
} 

在运行的过程只需要几秒钟,它看起来像整个事情是工作没有任何问题。当我更改控制台应用程序的配置以计算更多时,就会发现该过程正在运行数小时。在这段时间,我的C#应用​​程序从控制台应用程序中得不到任何响应由于控制台应用程序被隐藏,它看起来像应用程序被困住了,但事实并非如此。它已经在后台运行了,而且当控制台应用程序完成执行时,似乎所有的std输出都只传递给我的c#应用程序。 所以问题是,我没有看到std out行住在我的c#应用程序。它将在控制台应用程序完成后的几小时后刷新。

有什么办法可以刷新这个std out重定向吗? 有人知道为什么这不像我想要的那样工作吗?

PS:当我在普通的cmd窗口中以独立的方式执行控制台应用程序时,输出显示无任何问题。

请帮忙。

+0

你应该只使用'ProcessObj.StartInfo.RedirectStandardOutput = TRUE;'在代码中的错误重定向不使用你! – Writwick

+0

好的...这只是一个代码片段,所以你在真实代码中也会有相同的(真)循环来处理错误。 – fpdragon

+0

我会告诉你使用'ProcessObj.StartInfo.RedirectStandardError = true;'。我之前有过类似的问题,当时我更换了解决方案的重定向。 – Writwick

回答

1

尝试并在应用程序运行时读取输出?并将其保存到缓冲区?然后在应用程序退出时处理输出。

假的东西

string buffer = string.Empty; 
while(!process.HasExited) 
{ 
    string line = process.Stream.ReadLine(); 
    if (line != null) 
     buffer += Enviorment.Newline + line 
} 

// Do stuff without put here 
Console.Write(buffer); 
+0

我做了类似的事情。看到我的第一篇文章。我每隔100ms阅读一次Stream,但在控制台应用程序停止之前没有任何内容。 – fpdragon