c# - 控制台应用程序不会定期刷新输出

我正在使用一个第三方控制台应用程序,该应用程序定期将数据逐行输出到控制台。当我尝试通过我的应用程序运行它以便解析输出数据时,我注意到OutPutstream仅在应用程序退出后才可读。

我使用C#控制台应用程序测试了我的应用程序,该应用程序每5秒向控制台输出一些内容,并且按预期运行。我正在调用的第三方进程是用Java或C ++编写的(不确定),但看来它可能未遵循.NET对控制台应用程序期望的标准。

还有另一种方法来读取控制台应用程序输出的数据吗?

编辑:我正在从WPF应用程序调用该过程。因此需要异步读取。

编辑2:控制台应用程序从USB设备(加速度计-http://www.gcdataconcepts.com/)读取数据。

以下是我使用的代码:

    public void RunProcess()
    {
        Process process = new Process();
        process.StartInfo.FileName = "consoleApp.exe";

        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.CreateNoWindow = true;
        process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
        process.Start();
        process.BeginOutputReadLine();
    }

    private void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        if (!string.IsNullOrEmpty(outLine.Data))
        {
            Dispatcher.Invoke(new Action(() =>
            {
                textBlock1.Text += outLine.Data + Environment.NewLine;
            }), System.Windows.Threading.DispatcherPriority.Normal);
        }
    }

最佳答案

protected virtual void StartProcess() {
        // Start a new process for the cmd
        process = new Process();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.FileName = FileName;
        process.StartInfo.Arguments = Arguments;
        process.StartInfo.WorkingDirectory = WorkingDirectory;
        process.Start();

        // Invoke stdOut and stdErr readers - each
        // has its own thread to guarantee that they aren't
        // blocked by, or cause a block to, the actual
        // process running (or the gui).
        new MethodInvoker(ReadStdOut).BeginInvoke(null, null);
        new MethodInvoker(ReadStdErr).BeginInvoke(null, null);

    }

    /// <summary>
    /// Handles reading of stdout and firing an event for
    /// every line read
    /// </summary>
    protected virtual void ReadStdOut() {
        string str;
        while ((str = process.StandardOutput.ReadLine()) != null)
        {
            FireAsync(StdOutReceived, this, new DataReceivedEventArgs(str));
        }
    }

    /// <summary>
    /// Handles reading of stdErr
    /// </summary>
    protected virtual void ReadStdErr() {
        string str;
        while ((str = process.StandardError.ReadLine()) != null)
        {
            FireAsync(StdErrReceived, this, new DataReceivedEventArgs(str));
        }
    }

本文翻译自 https://stackoverflow.com/questions/4916348/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# console-application redirectstandardoutput


相关文章:

c# - 如何使控制台应用程序显示为“无响应”?

c# - 中断从C#开始的过程

c# - MongoDB C#Bson表示一个ObjectIds数组

java - Java的体面命令行解析和执行

c# - 为我尚未设置为null的对象分配内存

c# - 如何使用另一个.NET程序中的交互式命令行程序

c# - RedirectStandardOutput和批处理文件中的pause命令

c# - 更改链接按钮的颜色

c# - 如何使用开放XML将超链接添加到Word docx?

c# - Xamarin-在xmlns clr-namespace中找不到类型