zoukankan      html  css  js  c++  java
  • 在.NET程序中使用PIPE(管道技术)

     
    作者:夏桅
     这几天不知道做什么, 受朋友影响, 看完了"新天龙八部", 深受感动, 所以打算做点好事. =)

      关于PIPE的应用, 其实原理很简单, 所以我写这文章, 可能要被同行们贻笑大方了, 不过希望对不了解PIPE的新手有点帮助吧.

      .NET框架被设计为禁止内存共享的, 但是好在FCL依然提供了一些类, 使得我们还是可以使用管道技术.
    PIPE, 管道, 他的原理其实就是应用程序的输入输出重定向. 比如原来需要显示在屏幕上的东西不让他传送到屏幕, 而是让你的程序处理/分析, 再显示出结果. 下面是我刚才写的利用cmd.exe执行ping操作, 把结果在一个WinForm的RichTextBox中显示出的例子.
    [截图]


     

      using System;
      using System.Diagnostics;
      using System.Drawing;
      using System.Collections;
      using System.ComponentModel;
      using System.Threading;
      using System.Windows.Forms;

      namespace Sunmast.Sample.Pipe
      {
       public class Sample : System.Windows.Forms.Form
       {
        private Process p;

        private System.Windows.Forms.RichTextBox tbResult;
        private System.Windows.Forms.Button btnExit;
        private System.Windows.Forms.Button btnRefresh;

        private System.ComponentModel.Container components = null;

        public Sample()
        {
       InitializeComponent();
       Thread t = new Thread(new ThreadStart(Run));
       tbResult.Text = "Processing...";
       t.Start();
      }

      private void Run()
      {
       p = new Process();
       p.StartInfo.FileName = "cmd.exe";

       // 这里是关键点,不用Shell启动/重定向输入/重定向输出/不显示窗口
       p.StartInfo.UseShellExecute = false;
       p.StartInfo.RedirectStandardInput = true;
       p.StartInfo.RedirectStandardOutput = true;
       p.StartInfo.CreateNoWindow = true;

       p.Start();
       p.StandardInput.WriteLine("ping 127.0.0.1");// 向cmd.exe输入command
       p.StandardInput.WriteLine("exit");
       p.WaitForExit(60000);
       string s = p.StandardOutput.ReadToEnd();// 得到cmd.exe的输出
       p.Close();

       tbResult.Text = s.Replace("\r","").Replace("\n","\r\n");
      }

      protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        if(components != null)
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
      }

      [STAThread]
      static void Main()
      {
       Application.Run(new Sample());
      }

      #region Windows 窗体设计器生成的代码
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {
       this.tbResult = new System.Windows.Forms.RichTextBox();
       this.btnExit = new System.Windows.Forms.Button();
       this.btnRefresh = new System.Windows.Forms.Button();
       this.SuspendLayout();
       //
       // tbResult
       //
       this.tbResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
        | System.Windows.Forms.AnchorStyles.Left)
        | System.Windows.Forms.AnchorStyles.Right)));
       this.tbResult.BackColor = System.Drawing.SystemColors.Info;
       this.tbResult.Location = new System.Drawing.Point(8, 8);
       this.tbResult.Name = "tbResult";
       this.tbResult.ReadOnly = true;
       this.tbResult.Size = new System.Drawing.Size(376, 424);
       this.tbResult.TabIndex = 0;
       this.tbResult.Text = "";
       //
       // btnExit
       // 
       this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.btnExit.DialogResult = System.Windows.Forms.DialogResult.Cancel;
       this.btnExit.Location = new System.Drawing.Point(320, 440);
       this.btnExit.Name = "btnExit";
       this.btnExit.Size = new System.Drawing.Size(64, 24);
       this.btnExit.TabIndex = 1;
       this.btnExit.Text = "Exit";
       this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
       //
       // btnRefresh
       //
       this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.btnRefresh.Location = new System.Drawing.Point(248, 440);
       this.btnRefresh.Name = "btnRefresh";
       this.btnRefresh.Size = new System.Drawing.Size(64, 24);
       this.btnRefresh.TabIndex = 2;
       this.btnRefresh.Text = "Refresh";
       this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
       //
       // Sample
       //
       this.AcceptButton = this.btnRefresh;
       this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
       this.CancelButton = this.btnExit;
       this.ClientSize = new System.Drawing.Size(392, 471);
       this.Controls.Add(this.btnRefresh); 
       this.Controls.Add(this.btnExit);
       this.Controls.Add(this.tbResult);
       this.Name = "Sample";
       this.Text = "Sample";
       this.ResumeLayout(false);

      }
      #endregion

      private void btnExit_Click(object sender, System.EventArgs e)
      {
       Application.Exit();
      }

      private void btnRefresh_Click(object sender, System.EventArgs e)
      {
       this.Run();
        }
       }
      }
      // 在Windows2003 Server, .NET Framework1.1.4322平台运行通过, VS.NET 2003调试通过

  • 相关阅读:
    互联网 | 逻辑上的黑话才是真正的花里胡哨
    OLAP引擎:基于Druid组件进行数据统计分析
    数据调度组件:基于Azkaban协调时序任务执行
    职场 | 工作五年之后,对技术和业务的思考
    数据搬运组件:基于Sqoop管理数据导入和导出
    valgrind 内存泄漏分析
    Solon Cloud 分布式服务开发套件清单,感觉受与 Spring Cloud 的不同
    Solon 的想法与架构笔记
    对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.8 发布
    对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.2 重要发布
  • 原文地址:https://www.cnblogs.com/huqingyu/p/26944.html
Copyright © 2011-2022 走看看