博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【.net 深呼吸】通过标准输入/输出流来完成进程间通信
阅读量:5009 次
发布时间:2019-06-12

本文共 2783 字,大约阅读时间需要 9 分钟。

实现进程之间煲电话粥的方式,有好几种,比如,你可以用这些方案:

1、使用socket来传递。这个好像很无聊,本地进程之间也用socket?不过,通过本机回环网络确实可以进程之间通信。

2、WCF,与上面的相似,也是利用本机回环地址来在进程间通信。

3、内存映射文件。这个可能有些朋友不太熟,毕竟平时装逼时也装不上这个。内存映射文件类似于磁盘中的物理文件,只不过它是存在于内存中的,一旦引用文件的最后一个进程退出,内存映射文件就会释放。多个进程间可以共享内存映文件来分享银行卡上的钱。

 

本文老周还介绍第 4 种方案——通过标准的输入/输出流来读写。输入流是向一个进程写入数据,相反地,输出流就是从某个进程读取数据。

原理不复杂,实现起来也不难,只需要用到一个我们都很熟悉的类:Console,这个类不仅可以在控制台应用程序中输入/输出文本,也可以用于标准流。

 

好,老周用一个例子来说明一下。

这个例子是这样的,假设有一个可执行文件,它没有UI,只是用于安装,在安装过程中,它会实时输出安装进度。然后,有另外一个程序,有窗口,这个程序会调用前面那个程序进行安装,并实时读出安装进度,显示到进度条控件上。

 

首先实现第一个程序,无窗口无UI无房无车,纯屌丝一个。

class MainClass    {        static void Main()        {            BinaryWriter writer = new BinaryWriter(Console.OpenStandardOutput());            byte p = 0;            do            {                writer.Write(p);                Thread.Sleep(50);                p++;            }            while (p <= 100);            writer.Close();        }    }

获取标准流,可以调用 OpenStandardOutput,或OpenStandardInput,这两个方法返回的流对象,可以灵活操作。还可以访问 Out / In 属性来获取标准流,它返回的是 TextReader 或 TextWriter,这用于读写文本较方便。

此处,老周只考虑写一个数值(0 - 100),所以,用 BinaryWriter 类操作会快乐一点。

这个项目,你既能生成为控制台应用程序,也可以是Windows应用程序,只要是.exe即可。

 

随后,我们实现有窗口有UI有房有车,纯壕一个。

string exePath = @"..\..\..\SampleApp\bin\Debug\SampleApp.exe";            IProgress
prgs = new Progress
(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 == 100) 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属性必须为真,不然我们代码就无法访问输入/输出流,只有重定向后的标准流才能在代码中使用。

 

运行结果如下图所示。

 

 当然,你也可以用标准流来读写文本,或其他数据,这里读写数值,只作演示。

 

转载于:https://www.cnblogs.com/tcjiaan/p/6905285.html

你可能感兴趣的文章
健壮的 Java 基准测试
查看>>
zendoptimizer配置(转)
查看>>
phpstorm查看类的继承关系
查看>>
git create clone(仓库)
查看>>
chmod修改文件权限的命令
查看>>
新博客牵至简书
查看>>
矩阵求逆
查看>>
在 Windows 8、Windows 10 桌面模式下的 .NET Framework 程序中,引用 Windows.Runtime 的 API。...
查看>>
2015 8月24号 工作计划与实行
查看>>
MVC AJAX
查看>>
Google Map API V3开发(6) 代码
查看>>
Kafka初入门简单配置与使用
查看>>
第三章Git使用入门
查看>>
Amd,Cmd, Commonjs, ES6 import/export的异同点
查看>>
开源介绍:Google Guava、Google Guice、Joda-Time
查看>>
Nginx IP 白名单设置
查看>>
Java比较两个日期的大小
查看>>
学习总结 java 输入输出流
查看>>
【Spring Boot学习之十二】mybatis3 分页打印sql日志
查看>>
div中莫名出现一些空白..
查看>>