在Process()运行时使用表单

时间:2015-12-11 22:58:31

标签: c# winforms

我正在尝试将控制台应用程序的输出转到TextBox。

我正在使用以下代码打开应用程序&获得输出。

Process p = new Process();
p.StartInfo.FileName = "CMD.EXE";
p.StartInfo.Arguments = "/K Console.exe";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
WriteToLog(p.StandardOutput.ReadToEnd());
p.WaitForExit();

这会成功打开Console.exe,但在控制台关闭之前它不会输出到Log TextBox。 (WriteToLog()是我通过这种方式制作的函数。)

我已经尝试删除“p.WaitForExit();”部分,但它不会改变它。

我怎么能这样做?我只想让输出进入日志而不必关闭控制台。

如果你需要知道,这是我的WriteToLog函数:

public void WriteToLog(string value)
{
        Log.Text += value;
}

2 个答案:

答案 0 :(得分:2)

我这样做并且有效。 你可以尝试一下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            Process p = new Process();
            p.StartInfo.FileName = @"C:\loop.exe";
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
            p.Start();
            p.BeginOutputReadLine();
        }

        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            label1.Invoke((MethodInvoker)delegate
            {
                label1.Text = e.Data; // runs on UI thread
            });
        }
    }
}

调整命令行参数以满足您的需要。

答案 1 :(得分:1)

WaitForExit正如它所说的那样;它阻塞执行线程,直到进程终止。您可能正在寻找OutputDataReceived事件,您可以处理该事件以将输出附加到日志中。或者,在另一个线程上调用WaitForExit,我不建议这样做。