在流程执行期间不会刷新重定向标准输出

时间:2012-05-24 09:31:28

标签: c# visual-studio-2010 process redirectstandardoutput

我有一个控制台应用程序,我想在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#app。 所以问题是,我没有看到std out line存在于我的c#app中。它将在控制台应用程序完成后的几小时后刷新。

有没有办法刷新这个std out重定向? 有谁知道为什么这不能像我想的那样工作?

PS:当我在普通cmd窗口中独立执行控制台应用程序时,输出会立即显示。

请帮忙。

1 个答案:

答案 0 :(得分: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);