.NET 进程间通信框架 — SimpleMMF

一、前言

进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道、Socket、消息、本地文件、共享内存等,每种方式都有各自适应的场景。在进行大数据交换时,最优的方式便是共享内存。

但是共享内存在应用时往往需要配合其他的进程间通信方式,比如管道、消息等,用以通知共享内存中的数据发生了改变,所以共享内存在实际应用时是很繁琐的。

本框架——SimpleMMF,便是为解决这个痛点所开发的。本框架完全基于共享内存实现。

SimpleMMF的使用非常简单:实例化完毕后,响应事件即可,事件中会附带共享内存中的数据;需要向共享内存中写入数据时,调用一个方法即可。

SimpleMMF已经开源 

Github:https://github.com/lesliexinxin/LeslieXin.SimpleMMF

相信看完的你,一定会有所收获!

二、使用示例

流程

1、整体流程

b0ae27a8008112b0f408d0d7aa2705f5.jpeg

2、程序说明

服务端:DemoServer.exe。

作用:读取由客户端写入共享内存中的数据,并对数据进行处理,然后再次写入共享内存。

客户端:DemoClient.exe。

作用:往共享内存写数据,并从共享内存中读取修改后的数据,

实现

1、获取框架并添加引用

可以从Github中直接获取release,并手动添加dll引用。

81025b003a81ee5895c546ca6974639f.jpeg

2、服务端

外观设计

0320b946ac72732c569848c58842c456.jpeg

代码实现

以服务端方式实例化。
5b9c5ce0a41a748285f625f16a3577bf.jpeg
实现ServerMsg事件。

(注:以服务端方式实例化时,只会触发ServerMsg事件,所以只能响应ServerMsg事件;同理,以客户端方式实例化时,只会触发ClientMsg事件,所以只能响应ClientMsg事件。)

f81186783210653dd6cd9ec566459e9f.jpeg

3、客户端

外观设计

6070a6170cdbf9d32bcc72ccc4d7c2dc.jpeg
代码实现
以客户端方式实例化。
cec32f43cc97f29c37479c7c5d45f6ca.jpeg
实现ClientMsg事件。

(注:以服务端方式实例化时,只会触发ServerMsg事件,所以只能响应ServerMsg事件;同理,以客户端方式实例化时,只会触发ClientMsg事件,所以只能响应ClientMsg事件。)

获取共享内存数据,并显示。取到的数据会包含客户端实例化时的clientName,可以通过此值判断当前共享内存中的数据是否是当前客户端程序所需要的。

1b5f9acb04ba409956f5f8d49bd9e0be.jpeg
写入数据

在文本框内容发生改变时,将文本内容写入共享内存。

15169ae4dbe62f9526d12f0ecc283717.jpeg

演示

2582f06bfb9849cc593ee99786c60503.gif

三、实现原理

SimpleMMF在实例化时会分配3个共享内存:STATE、VALUE、CLIENT。如图所示:

131368f1d875d6d07e7a0cb1a57645e6.jpeg

SimpleMMF在实例化后,会一直遍历STATE的值,当STATE的值不等0时,进行下一步的处理:STATE的值等1,代表着有服务端写入了数据,读取此数据,并触发ClientMsg事件。STATE的值等2,代表着有客户端写入了数据,读取些数据,并触发ServerMsg事件,

在客户端写入数据时,除了向VALUE中写入数据外,还会向CLIENT中写入当前客户端的名称。用于在响应ClientMsg事件时,判断是哪个客户端写入的数据。

具体流程如下:

9f253b700fd498469e5b3d75bb572ba3.jpeg

四、总结

SimpleMMF的实现并不复杂,但是在实现后,使用起来却非常的简单方便,极大的提高了开发效率。

SimpleMMF是基于.NET 4.5实现的,如果需要调整为更早的.Net版本,下面提供下修改思路: 

1,.NET 4.0:修改事件ServerMsg、ClientMsg的定义方式,使用传统的事件定义方式重新定义即可。

2,.NET 4.0之前版本:修改读取共享内存、写入共享内存方法,需要用到Win32的相关API函数去读写共享内存。

转自:leslie_xin

链接:cnblogs.com/lesliexin/p/15106309.html

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值