从进程捕获实时输出在进程运行时不返回任何东西
本文关键字:进程 返回 运行时 任何东 实时输出 | 更新日期: 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
,RedirectStandardError
和CreateNoWindow
为true并取消注释BeginOutputReadLine
和BeginErrorReadLine
行时,似乎什么都没有发生。 - 我修改了外部进程,使其输出字符串并关闭终止。在这种情况下,我的代码(重定向和没有注释)似乎工作良好。
假设?
可能是我的外部进程没有真正运行,而是卡住了吗?那为什么直到我关闭控制台窗口它才会卡住呢?
在进行更多测试时,我开始认为这个问题可能来自外部过程。我用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;