Redirigir la salida estándar de manera eficiente en .NET
Pregunta
Estoy intentando llamar a php-cgi.exe desde un programa .NET. Utilizo RedirectStandardOutput para recuperar la salida como una secuencia, pero todo es muy lento.
¿Tienes alguna idea de cómo puedo hacer eso más rápido? ¿Alguna otra técnica?
Dim oCGI As ProcessStartInfo = New ProcessStartInfo()
oCGI.WorkingDirectory = "C:\Program Files\Application\php"
oCGI.FileName = "php-cgi.exe"
oCGI.RedirectStandardOutput = True
oCGI.RedirectStandardInput = True
oCGI.UseShellExecute = False
oCGI.CreateNoWindow = True
Dim oProcess As Process = New Process()
oProcess.StartInfo = oCGI
oProcess.Start()
oProcess.StandardOutput.ReadToEnd()
Solución
Puede utilizar el evento OutputDataReceived para recibir datos como se bombea a StdOut.
Otros consejos
La mejor solución que he encontrado es:
private void Redirect(StreamReader input, TextBox output)
{
new Thread(a =>
{
var buffer = new char[1];
while (input.Read(buffer, 0, 1) > 0)
{
output.Dispatcher.Invoke(new Action(delegate
{
output.Text += new string(buffer);
}));
};
}).Start();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
process = new Process
{
StartInfo = new ProcessStartInfo
{
CreateNoWindow = true,
FileName = "php-cgi.exe",
RedirectStandardOutput = true,
UseShellExecute = false,
WorkingDirectory = @"C:\Program Files\Application\php",
}
};
if (process.Start())
{
Redirect(process.StandardOutput, textBox1);
}
}
El problema se debe a una mala configuración de php.ini. Tuve el mismo problema y descargué el instalador de Windows de: http://windows.php.net/download/ .
Después de eso y comentando las extensiones no necesarias, el proceso de conversión es alà Speedy Gonzales, que convierte 20 php por segundo.
Puede usar de forma segura " oProcess.StandardOutput.ReadToEnd () " ;. Es más legible y casi tan rápido como usar la solución de hilos. Para utilizar la solución de subprocesos junto con una cadena, debe introducir un evento o algo.
Saludos