【问题标题】:Console application doesn't periodically flush output控制台应用程序不会定期刷新输出
【发布时间】:2011-06-22 10:16:23
【问题描述】:

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

我使用 C# 控制台应用程序测试了我的应用程序,该应用程序每 5 秒向控制台输出一些内容,并且它按预期工作。我调用的第 3 方进程是用 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);
        }
    }

【问题讨论】:

标签: c# console-application redirectstandardoutput


【解决方案1】:
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));
        }
    }

【讨论】:

    【解决方案2】:

    你也可以这样做:

    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.Start();
    
        for (; ; )
        {
            string line = process.StandardOutput.ReadLine();
            if (line == null)
                break;
    
            Dispatcher.Invoke(new Action(() =>
                {
                    textBlock1.Text += outLine.Data + Environment.NewLine;
                }), System.Windows.Threading.DispatcherPriority.Normal);
        }
        ...
    }
    

    【讨论】:

    • 不工作。相同的行为。我只在设置CreateNoWindow = false 并手动关闭窗口时看到输出。
    • @Omar - “我只在...时看到输出”是什么意思。使用这种代码,你不应该看到输出,这就是它应该工作的方式,因为它被重定向了。或者我错过了什么?
    • 我的意思是我只能看到我生成的控制台的输出,而不是创建进程的应用程序中的输出。
    【解决方案3】:

    更简单的方法是在 process 对象上使用 StandardOutput 对象。示例代码:

    Process process = new Process();
    process.StartInfo.FileName = @"StackOverflowTest.exe";
    
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.CreateNoWindow = true;
    process.Start();
    
    while (!process.StandardOutput.EndOfStream) 
    {
        Console.WriteLine("got: " + process.StandardOutput.ReadLine());
    }
    

    【讨论】:

    • 不工作。相同的行为。我只在设置CreateNoWindow = false 并手动关闭窗口时看到输出。
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2011-03-10
    • 2012-05-02
    • 2010-12-22
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多