Эффективное перенаправление стандартного вывода в .NET
Вопрос
Я пытаюсь позвонить php-cgi.exe из программы .NET.Я использую RedirectStandardOutput, чтобы вернуть выходные данные в виде потока, но все это происходит очень медленно.
У вас есть какие-нибудь идеи о том, как я могу сделать это быстрее?Какая-нибудь другая техника?
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()
Решение
Вы можете использовать событие OutputDataReceived получать данные по мере их поступления в StdOut.
Другие советы
Лучшее решение, которое я нашел, это:
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);
}
}
Проблема связана с плохой конфигурацией php.ini.У меня была такая же проблема, и я скачал установщик Windows с: http://windows.php.net/download/.
После этого и закомментирования ненужных расширений процесс преобразования выполняется alà Speedy Gonzales, конвертируя 20 php в секунду.
Вы можете смело использовать "oProcess.StandardOutput.ReadToEnd()".Это более читабельно и почти так же быстро, как использование потокового решения.Чтобы использовать решение thread в сочетании со строкой, вам нужно ввести событие или что-то в этом роде.
Ваше здоровье