Эффективное перенаправление стандартного вывода в .NET

StackOverflow https://stackoverflow.com/questions/164736

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь позвонить 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 в сочетании со строкой, вам нужно ввести событие или что-то в этом роде.

Ваше здоровье

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top