Rediriger efficacement la sortie standard dans .NET
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()
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