从进程捕获实时输出在进程运行时不返回任何东西

本文关键字:进程 返回 运行时 任何东 实时输出 | 更新日期: 2023-09-27 18:12:33

问题

我有一个外部进程输出文本的问题,但我的c#应用程序无法捕获它。外部进程将永远运行,并不时输出文本。

下面的代码部分工作…控制台打开,但即使认为该进程正在输出数据,也不会发生任何事情,直到我手动关闭控制台窗口。此时,我的控制台窗口输出外部进程必须说的话。

我的Visual c#表单运行以下代码:

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "MyFile.exe";
p.StartInfo.Arguments = "arguments";
p.StartInfo.RedirectStandardInput = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.RedirectStandardError = false;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.OutputDataReceived += new DataReceivedEventHandler( pOutputHandler );
p.ErrorDataReceived += new DataReceivedEventHandler( pOutputHandler );
started = p.Start();
//p.BeginOutputReadLine();
//p.BeginErrorReadLine();

private void pOutputHandler( object sendingProcess, DataReceivedEventArgs outLine )
{
    Console.writeLine( outLine.data + Environment.NewLine;
}

What I have try

  • 当我设置RedirectStandardInput, RedirectStandardOutput, RedirectStandardErrorCreateNoWindow为true并取消注释BeginOutputReadLineBeginErrorReadLine行时,似乎什么都没有发生。
  • 我修改了外部进程,使其输出字符串并关闭终止。在这种情况下,我的代码(重定向和没有注释)似乎工作良好。

假设?

可能是我的外部进程没有真正运行,而是卡住了吗?那为什么直到我关闭控制台窗口它才会卡住呢?

在进行更多测试时,我开始认为这个问题可能来自外部过程。我用c++写了下面的Process:

int main()
{
    int x = 0;
    while( x < 100 )
    {
        Sleep( 100 );
        x = x + 1;
        cout << "Testing 123! " << x << "'r";
    }
    return 1;
}

在我的c#应用程序中使用此进程作为外部进程时,在进程完成并退出的那一刻,输出将被捕获在我的处理程序中。为什么异步回调只捕获进程退出后的输出?我能做些什么来防止这种情况发生,并捕获"实时"输出?

从进程捕获实时输出在进程运行时不返回任何东西

解决方案

在查阅了c++的文档后,我遇到了"刷新输出缓冲区"的主题。

在外部进程中,我唯一要做的就是在我想要立即发送输出文本时添加以下代码行:
cout << "Some string" << someVar;
cout << flush;