Pergunta

Eu estou tentando chamar php-cgi.exe de um programa de .NET. Eu uso RedirectStandardOutput para obter a volta de saída como um fluxo, mas a coisa toda é muito lenta.

Você tem alguma idéia de como eu posso fazer isso mais rápido? Qualquer outra 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()
Foi útil?

Solução

Você pode usar o OutputDataReceived evento para receber dados, como é bombeado para StdOut.

Outras dicas

A melhor solução que eu encontrei é:

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

O problema é devido a uma má configuração php.ini. Eu tive o mesmo problema e eu baixei o instalador do Windows a partir de: http://windows.php.net/download/ .

Depois disso e comentar a extensões não são necessários, o processo de conversão é Ala Ligeirinho, a conversão de 20 php por segundo.

Você pode usar com segurança "oProcess.StandardOutput.ReadToEnd ()". É mais legível e alomost tão rápido quanto usando a solução de rosca. Para utilizar a solução de segmento em conjunto com uma corda que você precisa para introduzir um evento ou algo assim.

Felicidades

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top