zoukankan      html  css  js  c++  java
  • C# Process运行cmd命令的异步回显 纵一苇之所如

    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 CmdCallbackShow
    {
        // 1.定义委托
        public delegate void DelReadStdOutput(string result);
        public delegate void DelReadErrOutput(string result);

        public partial class Form1 : Form
        {
            // 2.定义委托事件
            public event DelReadStdOutput ReadStdOutput;
            public event DelReadErrOutput ReadErrOutput;

            public Form1()
            {
                InitializeComponent();
                Init();
            }

            private void Init()
            {
                //3.将相应函数注册到委托事件中
                ReadStdOutput += new DelReadStdOutput(ReadStdOutputAction);
                ReadErrOutput += new DelReadErrOutput(ReadErrOutputAction);
            }

            private void button1_Click(object sender, EventArgs e)
            {
                // 启动进程执行相应命令,此例中以执行ping.exe为例
                RealAction("ping.exe", textBox1.Text);
            }
           
            private void RealAction(string StartFileName, string StartFileArg)
            {
                Process CmdProcess = new Process();
                CmdProcess.StartInfo.FileName = StartFileName;      // 命令
                CmdProcess.StartInfo.Arguments = StartFileArg;      // 参数

                CmdProcess.StartInfo.CreateNoWindow = true;         // 不创建新窗口
                CmdProcess.StartInfo.UseShellExecute = false;
                CmdProcess.StartInfo.RedirectStandardInput = true;  // 重定向输入
                CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向标准输出
                CmdProcess.StartInfo.RedirectStandardError = true;  // 重定向错误输出
                //CmdProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

                CmdProcess.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
                CmdProcess.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);

                CmdProcess.EnableRaisingEvents = true;                      // 启用Exited事件
                CmdProcess.Exited += new EventHandler(CmdProcess_Exited);   // 注册进程结束事件

                CmdProcess.Start();
                CmdProcess.BeginOutputReadLine();
                CmdProcess.BeginErrorReadLine();

                // 如果打开注释,则以同步方式执行命令,此例子中用Exited事件异步执行。
                // CmdProcess.WaitForExit();    
            }

            private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
            {
                if (e.Data != null)
                {
                    // 4. 异步调用,需要invoke
                    this.Invoke(ReadStdOutput, new object[] { e.Data });
                }
            }

            private void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
            {
                if (e.Data != null)
                {
                    this.Invoke(ReadErrOutput, new object[] { e.Data });
                }
            }

            private void ReadStdOutputAction(string result)
            {
                this.textBoxShowStdRet.AppendText(result + "\r\n");
            }

            private void ReadErrOutputAction(string result)
            {
                this.textBoxShowErrRet.AppendText(result + "\r\n");
            }

            private void CmdProcess_Exited(object sender, EventArgs e)
            {
                // 执行结束后触发
            }
        }
    }

    转自:irwin_chenhttp://blog.csdn.net/irwin_chen/article/details/7430551

  • 相关阅读:
    SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码
    SQL——触发器——插入触发器——边学边项目写的。
    SQL链表查询 数据库为空
    【错误积累】更新失败,数据包解压时出现错误!
    VS使用技巧(转)
    命令模式
    代理模式
    模板方法模式
    享元模式
    MongoDB 分片2
  • 原文地址:https://www.cnblogs.com/panjinzhao/p/3144137.html
Copyright © 2011-2022 走看看