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()
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top