Question

J'essaie d'appeler php-cgi.exe à partir d'un programme .NET. J'utilise RedirectStandardOutput pour récupérer la sortie sous forme de flux, mais l'ensemble est très lent.

Avez-vous une idée de la façon dont je pourrais accélérer les choses? Une autre technique?

    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()
Était-ce utile?

La solution

Vous pouvez utiliser l’événement OutputDataReceived . pour recevoir des données telles qu'elles sont pompées vers StdOut.

Autres conseils

La meilleure solution que j'ai trouvée est:

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

Le problème est dû à une mauvaise configuration de php.ini. J'ai eu le même problème et j'ai téléchargé le programme d'installation de Windows à partir de: http://windows.php.net/download/ .

Après cela et après avoir commenté les extensions inutiles, le processus de conversion est à la vitesse de Speedy Gonzales, convertissant 20 php par seconde.

Vous pouvez utiliser en toute sécurité "oProcess.StandardOutput.ReadToEnd ()". C'est plus lisible et presque aussi rapide que d'utiliser la solution de thread. Pour utiliser la solution de thread en conjonction avec une chaîne, vous devez introduire un événement ou autre.

A bientôt

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top