在.NET程序中使用PIPE(管道技术)

原创 2003年12月22日 18:20:00

在.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调试通过.

怎么样, 很简单吧? 要是还不懂自己调试调试代码就明白啦.
关于Windows的PIPE技术本身, 可以看看这两篇文章:
Windows管道技术简述
Windows系列操作系统对线程间通信的支持

我的BLOG: http://blog.sunmast.com/

.net中的命名管道(NamedPipe)

.net中的命名管道(NamedPipe)
  • ztmsimon
  • ztmsimon
  • 2016年05月29日 15:48
  • 375

Linux 管道(pipe)原理及使用

简介:本文主要介绍了管道(pipe)的基本概念和用途;分析了环形缓冲区的存储、访问及其实现方法;分析并发访问可能引发的问题,并给出解决方法;分析了linux2.6.29内核中pipe的读写函数。 ...
  • jmppok
  • jmppok
  • 2013年12月20日 17:44
  • 3149

管道的三种使用方案中,唯一正确而安全的使用方法

系统自带的管道方法: 全局变量: NSPipe * pipe = [NSPipe pipe] ; NSFileHandle *pipeReadHandle = [pipe fileHandl...
  • jia12216
  • jia12216
  • 2016年03月24日 09:40
  • 832

Angular2 中管道@Pipe的简单用法

在Angular2中有各种各样的类修饰器,比如:@App,@Component,@input,@output等等,最近需要用到数据过滤用到了管道@Pipe,下面记录简单@Pipe的简单用法。Pipe(...
  • Neokekeke
  • Neokekeke
  • 2017年12月08日 14:33
  • 114

进程间通信---匿名管道pipe

进程间匿名管道通信,c++
  • fly542
  • fly542
  • 2014年01月28日 13:04
  • 3003

Windows管道通信实现进程通信

Windows下用管道通信(pipe)实现进程间数据共享管道是一种用于在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享的内存设计采用数据流I/0的方式来访问。由一个进程读、另...
  • demon_xiao
  • demon_xiao
  • 2015年04月22日 17:19
  • 5452

管道和多线程

管道是内核维护的一个缓存, 它提供两个 fd, 从一个fd写入数据, 从另一个fd读出数据.  所以它是半双工的.  我在这里讨论一下如何在单进程多线程环境下使用管道. 假设一个系统里有多个生产者...
  • chengangdzzd
  • chengangdzzd
  • 2016年03月22日 20:00
  • 2605

MFC 匿名管道实现输出

管道技术(Pipe),是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。 管道可以是单向的:一端是只读的,另一端点是只写的; 也可以是双向的:管道的两端点既可读也可写。 ...
  • qq61394323
  • qq61394323
  • 2014年09月13日 17:09
  • 2134

Angular2 管道pipe,如何自定义管道

作为一名前端er,我们的数据要推入到视图中,但是HTML视图中显示的格式和数据未必完成相同,比如我们的数据都是小写,但是视图中需要显示大写,如果我们在代码中另存一组转换为大写的数据,不但会使代码变得复...
  • erciyuan_nuonuo
  • erciyuan_nuonuo
  • 2016年11月20日 15:18
  • 1843

Asp.net MVC进入请求管道的过程

一:Asp.Net MVC请求处理原理(Asp.Net mvc 是怎样进入请求管道的。) 请求-->IIS--->ISAPIRuntime-->HttpWorkRequest-->HttpRuntim...
  • zy0421911
  • zy0421911
  • 2016年04月21日 11:54
  • 2513
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在.NET程序中使用PIPE(管道技术)
举报原因:
原因补充:

(最多只允许输入30个字)