C# - 实时输出命令提示符到文本框

时间:2017-01-27 14:13:14

标签: c# process backgroundworker streamreader

我正在创建一个测试程序,该程序会将命令行工具的输出实时报告给文本框,以了解其工作原理,并学习在未来项目中使用的基础知识。我当前的代码只是将本地环回IP地址五次ping并将输出发送到文本框。最初我在“ping”期间遇到了UI锁定问题,因此我已经合并了一名后台工作人员,因此用户界面仍然保持响应状态,同时“ping”' ping'命令运行。但是我的问题是我似乎无法实时地在文本框中显示ping输出(例如,因此每个5 ping响应都出现在文本框中,就像在命令提示符中一样)。目前没有任何事情发生5秒,然后完整的' ping'结果一次显示:

Before After

这是我目前的代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            bgw.WorkerReportsProgress = true;
            bgw.WorkerSupportsCancellation = true;
            bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        }

        //////////////////////////////////////////////////////////
        // Begin ping test
        //////////////////////////////////////////////////////////
        private void btnPing_Click(object sender, EventArgs e)
        {
            if (bgw.IsBusy != true)
            {
                bgw.RunWorkerAsync();
            }
        }

        //////////////////////////////////////////////////////////
        // Background worker
        //////////////////////////////////////////////////////////
        private void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            Process proc = new Process();
            proc.StartInfo.FileName = "ping";
            proc.StartInfo.Arguments = "127.0.0.1 -n 5";
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.CreateNoWindow = true;

            proc.Start();

            using (StreamReader reader = proc.StandardOutput)
            {
                string stdout = reader.ReadToEnd();
                this.Invoke((MethodInvoker)delegate
                {
                    txtOutput.AppendText(stdout);
                });
            }
            proc.WaitForExit();
        }

        //////////////////////////////////////////////////////////
        // Background worker completed
        //////////////////////////////////////////////////////////
        private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                btnPing.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                btnPing.Text = "Error: " + e.Error.Message;
            }
            else
            {
                btnPing.Text = "Success!";
            }
        }
    }

我查看了类似的帖子和MSDN参考文献但是绘制了空白,因为这些技术超出了我目前的理解水平,或者似乎是无关的。可以理解正确方向的指针。

0 个答案:

没有答案