0

问题

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

以下代码部分工作......控制台打开但即使进程正在输出数据,在我手动关闭控制台窗口之前什么都没有发生。那时我的控制台窗口会输出外部进程必须说的内容。

我的 Visual C# Form 运行以下代码:

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;
}

我试过的

  • 当我将RedirectStandardInput, RedirectStandardOutput, RedirectStandardErrorand设置CreateNoWindow为 true 并取消注释BeginOutputReadLineandBeginErrorReadLine行时,似乎什么都没有发生。
  • 我修改了外部进程,使其输出字符串并关闭终止。在那种情况下,我的代码(重定向并且没有评论)似乎工作正常。

假设?

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

附加信息

在进行更多测试时,我开始认为这个问题可能来自外部进程。我用 C++ 编写了以下流程:

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

在我的 C# 应用程序中将此进程用作外部进程时,当进程完成并退出时,输出会在我的处理程序中捕获。异步回调怎么可能只在进程退出后才捕获输出?我能做些什么来防止这种情况发生并“实时”捕获输出?

4

1 回答 1

0

解决方案

在查看了 C++ 的文档后,我遇到了“刷新输出缓冲区”的主题。

在外部进程中,我唯一需要做的就是在我希望立即发送输出文本时添加以下代码行:

cout << "Some string" << someVar;
cout << flush;
于 2013-05-07T16:47:47.543 回答