【.net 深呼吸】通过标准输入/输出流来完成进程间通信
实现进程之间煲电话粥的方式,有好几种,比如,你可以用这些方案:
1、使用socket来传递。这个好像很无聊,本地进程之间也用socket?不过,通过本机回环网络确实可以进程之间通信。
2、WCF,与上面的相似,也是利用本机回环地址来在进程间通信。
3、内存映射文件。这个可能有些朋友不太熟,毕竟平时装逼时也装不上这个。内存映射文件类似于磁盘中的物理文件,只不过它是存在于内存中的,一旦引用文件的最后一个进程退出,内存映射文件就会释放。多个进程间可以共享内存映文件来分享银行卡上的钱。
本文老周还介绍第 4 种方案——通过标准的输入/输出流来读写。输入流是向一个进程写入数据,相反地,输出流就是从某个进程读取数据。
原理不复杂,实现起来也不难,只需要用到一个我们都很熟悉的类:Console,这个类不仅可以在控制台应用程序中输入/输出文本,也可以用于标准流。
好,老周用一个例子来说明一下。
这个例子是这样的,假设有一个可执行文件,它没有UI,只是用于安装,在安装过程中,它会实时输出安装进度。然后,有另外一个程序,有窗口,这个程序会调用前面那个程序进行安装,并实时读出安装进度,显示到进度条控件上。
首先实现第一个程序,无窗口无UI无房无车,纯屌丝一个。
class MainClass
{
static void Main()
{
BinaryWriter writer = new BinaryWriter(Console.OpenStandardOutput());
byte p = ;
do
{
writer.Write(p);
Thread.Sleep();
p++;
}
while (p <= );
writer.Close();
}
}
获取标准流,可以调用 OpenStandardOutput,或OpenStandardInput,这两个方法返回的流对象,可以灵活操作。还可以访问 Out / In 属性来获取标准流,它返回的是 TextReader 或 TextWriter,这用于读写文本较方便。
此处,老周只考虑写一个数值(0 - 100),所以,用 BinaryWriter 类操作会快乐一点。
这个项目,你既能生成为控制台应用程序,也可以是Windows应用程序,只要是.exe即可。
随后,我们实现有窗口有UI有房有车,纯壕一个。
string exePath = @"..\..\..\SampleApp\bin\Debug\SampleApp.exe";
IProgress<int> prgs = new Progress<int>(p =>
{
progressBar1.Value = p;
}); ……
await Task.Run(() =>
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = exePath; //要执行的.exe文件
start.CreateNoWindow = true; //无窗口
start.UseShellExecute = false; //非Shell行为
start.RedirectStandardOutput = true; //必须,否则连毛都不出来
Process p = Process.Start(start);
BinaryReader reader = new BinaryReader(p.StandardOutput.BaseStream);
while (true)
{
byte prs = reader.ReadByte();
prgs.Report(prs);
if (prs == ) break;
}
reader.Close();
p.WaitForExit();
p.Close();
});
……
IProgress<T>是个好东西,它的实现类是 Progress<T>,只要我们在UI线程上把它实例化(即它的实例属于UI线程),那么在跨线程报告进度时会简便很多。实例化时,传一个Action<T>委托实例,用来回调进度。
启动进程前要准备一个 ProcessStartInfo,它可以设置一些参数。
如:
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = exePath; //要执行的.exe文件
start.CreateNoWindow = true; //无窗口
start.UseShellExecute = false; //非Shell行为
start.RedirectStandardOutput = true; //必须,否则连毛都不出来
反正安装程序是没有UI的,就让CreateNoWindow为真,不创建主窗口。另外,RedirectStandardOutput属性必须为真,不然我们代码就无法访问输入/输出流,只有重定向后的标准流才能在代码中使用。
运行结果如下图所示。

当然,你也可以用标准流来读写文本,或其他数据,这里读写数值,只作演示。
【.net 深呼吸】通过标准输入/输出流来完成进程间通信的更多相关文章
- IO流(三)__字节流 标准输入输出流 转换流
一.字节流:FileInputStream 和FileOutputStream 基本操作和字符流类相同,没有flush,但是close还是要的 复制一个字节流文件 private static voi ...
- 黑马程序员——JAVA基础之标准输入输出流
------- android培训.java培训.期待与您交流! ---------- 标准输入输出流: System中的基本字段,in,out 它们各代表了系统标准的输入和输出设备. 默认输入设备是 ...
- freopen()——重定向标准输入输出流
freopen()——重定向标准输入输出流 头文件:stdio.h 函数原型:FILE * freopen(const char *filename , const char *type , FIL ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- Java标准输入输出流的重定向及恢复
在Java中输入输出数据一般(图形化界面例外)要用到标准输入输出流System.in和System.out,System.in,System.out默认指向控制台,但有时程序从文件中输入数据并将结果输 ...
- Java精选笔记_其他IO流(ObjectInputStream、DataInputStream、PrintStream、标准输入输出流)
其他IO流 ObjectInputStream和ObjectOutputStream 如果希望永久将对象转为字节数据写入到硬盘上,即对象序列化,可以使用ObjectOutputStream(对象输出流 ...
- Java IO流-标准输入输出流
2017-11-05 19:13:21 标准输入输出流:System类中的两个成员变量. 标准输入流(public static final InputStream in):“标准”输入流.此流已打开 ...
- 序列流、对象操作流、打印流、标准输入输出流、随机访问流、数据输入输出流、Properties(二十二)
1.序列流 * 1.什么是序列流 * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.* 2.使用方式 * 整合两个 ...
- java 标准输入输出流,打印流,数据流
1 package stream; import static org.junit.Assert.assertNotNull; import java.io.BufferedReader; impor ...
随机推荐
- Redis基础学习(五)—Redis的主从复制
一.概述 Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中.让从服务 ...
- jenkins容器权限被被拒绝
问题,我们从官网上面pull下jenkins后,如果直接运行容器的没问题 docker run -d -p 8080:8080 -v jenkins:latest 不过我们可能需要映射下容器内部的地址 ...
- 3 安装Zookeeper
cnblogs-DOC 1.服务器环境 2.安装Redis3.安装Zookeeper4.安装MPush5.安装Alloc服务6.完整测试7.常见问题 从官网直接下载Zookeeper最新版本(Zook ...
- EasyUI之Hello world(EasyUI的入门学习)
1:创建一个动态web工程: 去官网http://www.jeasyui.net/download/下载官网文档 我去官网下载的最新版本,个人根据自己的需求下载即可.2:在webConte ...
- iOS数据本地化
本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...
- cookie,session,token的定义及区别
参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...
- 【Android】再来一篇Fragment懒加载(只加载一次哦)
效果 老规矩,先来看看效果图 没错,我又入坑了,又重新做了个 Gank 客户端,因为之前那个代码写得太烂了,这次有好好的考虑了下架构之类的事,代码应该会更容易读懂了点了,吧.哈哈,再次欢迎来 star ...
- 我使用的Chrome插件列表
AdBlock 用来屏蔽广告的,有一些网站会探测出你在使用AdBlock.如果一定要继续浏览的话,你可能需要暂停一下AdBlock Vimium 非常推荐喜欢vim的用户试试看这款插件,它的主要特色是 ...
- CSS3弹性伸缩布局(中)——flexbox布局
混合过渡版 上一篇我们主要讲了旧版box布局,今天这篇主要讲flexbox布局. 混合版本的Flexbox模型是2011年提出的工作草案,主要是针对IE10浏览器实现的伸缩布局效果,其功能和旧版本的功 ...
- 【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus
A - Max Sum Plus Plus https://vjudge.net/contest/68966#problem/A http://www.cnblogs.com/kuangbin/arc ...