代码之家  ›  专栏  ›  技术社区  ›  Vincent

在.NET中高效重定向标准输出

  •  9
  • Vincent  · 技术社区  · 16 年前

    我正试图从.NET程序调用php-cgi.exe。我使用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()
    
    3 回复  |  直到 14 年前
        1
  •  8
  •   Bob King    16 年前

    你可以使用 OutputDataReceived event 当它被抽到stdout时接收数据。

        2
  •  16
  •   Jader Dias    14 年前

    我找到的最佳解决方案是:

    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);
        }
    }
    
        3
  •  2
  •   Martin.Martinsson    14 年前

    问题是由于php.ini配置不正确。我有同样的问题,我从以下位置下载了Windows Installer: http://windows.php.net/download/ .

    在那之后,注释出不需要的扩展,转换过程是al_speedy gonzales,每秒转换20 php。

    您可以安全地使用“oprocess.standardoutput.readToend()”。它比使用线程解决方案更具可读性和最快的速度。要将线程解决方案与字符串结合使用,需要引入事件或其他内容。

    干杯