我想在控制台中读取表单中的进程输出(标准输出与一个流中的标准错误混合).有办法怎么做?
我正在考虑使用
ProcessStartInfo.UseShellExecute = true;
Run Code Online (Sandbox Code Playgroud)
但后来我无法异步读取输出.如果我订
process.ProcessStartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += new DataReceivedEventHandler(partialOutputHandler);
Run Code Online (Sandbox Code Playgroud)
然后我可以读标准输出(我可以做同样的标准错误)但我不知道如何模拟控制台的行为(混合stdout和stderr).
注意:我知道Linux具有将标准错误流重定向到标准输出流的功能,但我无法将其用于.NET.
我必须错过一些非常简单的事情
谢谢!
Oha*_*der 43
你的意思是这样的吗?
SynchronizationContext _syncContext;
MyForm()
{
_syncContext = SynchronizationContext.Current;
}
void StartProcess()
{
using (var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "myProcess.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
}
})
{
process.OutputDataReceived += (sender, args) => Display(args.Data);
process.ErrorDataReceived += (sender, args) => Display(args.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit(); //you need this in order to flush the output buffer
}
}
void Display(string output)
{
_syncContext.Post(_ => myTextBox.AppendText(output), null);
}
Run Code Online (Sandbox Code Playgroud)
我找到了答案:
输出流被缓冲。无法获得插入流中的项目的真实顺序。事实上,这没有什么意义,因为两个流也可以同时写入。它们是相互独立的。因此,您能做的最好的事情就是在每个到达时获取它们的顺序输出。
一般来说,这不是问题,因为几乎所有控制台应用程序都使用标准输出来输出和错误消息。某些应用程序使用错误流,但消息通常是输出流中生成的错误的重复。
来源: http://social.msdn.microsoft.com/Forums/uk/csharpgeneral/thread/192b6df7-9437-42cf-81c1-c125021735ba
归档时间: |
|
查看次数: |
20399 次 |
最近记录: |