阅读过程输出?

时间:2017-09-28 13:57:56

标签: c# winforms redirectstandardoutput

在我的表单中,我通过运行可执行文件loader.exe(visual studio中的另一个项目)开始操作,该文件随着时间的推移在控制台上打印一些信息,直到它终止。我想做的是: 我想在继续执行时读取控制台,并在表单应用程序的文本框textBoxConsole1中显示最新输出(带有一些额外信息的百分比),以便用户可以了解进度。

编辑:目前,它有点复杂。它显示一些输出,然后显示其他输出,然后显示整个剩余输出。与loader.exe不一样。

在这个帖子中 C# Show output of Process in real time

Mr.Passant说:

"这很正常,当您重定向其输出时,该过程将切换到缓冲输出。如果它没有吐出很多文本,那么该缓冲区不会填充足够以使其被刷新。如果你无法修复程序的代码,那么你无能为力。"

这个"足够多"究竟?我的代码:

private void buttonConnect_Click(object sender, EventArgs e)
    {
        Thread findThread = new Thread(findProcedure);
        findThread.Start();
    }

    public void findProcedure()
    {
        Process process = new Process();
        process.StartInfo.FileName = PATH;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.CreateNoWindow = true;

        process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
        {
            if (!String.IsNullOrEmpty(e.Data))
            {
                //textBoxConsole1.Text = e.Data; //Cross-thread validation exception
                //use thread safe set method instead
                setConsole1(e.Data);
            }
        });


        process.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
        {
            if (!String.IsNullOrEmpty(e.Data))
            {
                setConsole3(e.Data);
            }
        });

        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        process.WaitForExit();
    }

我的线程安全设置方法:

public void setConsole1(string str)
    {
        if (this.textBoxConsole1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(setConsole1);
            this.Invoke(d, new object[] { str });
        }
        else
        {
            textBoxConsole1.AppendText(str);
            textBoxConsole1.AppendText(Environment.NewLine);
        }
    }

错误数据处理程序方法setConsole3setConsole1相同,但设置为另一个框。

1 个答案:

答案 0 :(得分:0)

您应该在StartInfo中将RedirectStandardOutput设置为true。

Process process = new Process();
try
{
  process.StartInfo.FileName = fileName // Loader.exe in this case;
  ...
  //other startInfo props 
  ...
  process.StartInfo.RedirectStandardError = true;
  process.StartInfo.RedirectStandardOutput = true;
  process.OutputDataReceived += OutputReceivedHandler //OR (sender, e) => Console.WriteLine(e.Data);
  process.ErrorDataReceived += ErrorReceivedHandler;
  process.Start();
  process.BeginOutputReadline();
  process.BeginErrorReadLine();
  ....
  //other thing such as wait for exit 
}