使用MessagePipe实现进程间通信

52d623c3a8156b2592c660fcc2251c6b.gif

0da097e1575f360f7c007e7908305f3d.png

1、MessagePipe介绍

可以用于.NETUnity上面的高性能的内存/分布式消息传递管道。适用于发布/订阅模式、CQRS的中介模式、Prism中的EventAggregator、IPC(进程间通信)-RPC等。

支持:

  • 依赖注入

  • 过滤器管道

  • 更好的事件

  • 同步/异步

  • 带键值的/无键值的

  • 单例/Scoped

  • 广播/响应(+更多)

  • 内存/进程间/分布式

MessagePipe 比标准的 C# event更快,是Prism的EventAggregator的78倍。下面是官方给出的测试截图

e34ab51dfd4bc2291b545e09c23cc2d3.png

每次使用publish分配的内存更少c6946589a589225afa7e317f5f6d9f3e.png

还提供了Roslyn分析器以防止订阅泄露。5f6dfa31dfbad20a98197503c16e3e46.png本库采用MIT协议

2、MessagePipe分布式发布/订阅的使用(进程间通信)

2.1 新建两个Wpf项目

项目名称分别为:MessagePipePublishAppMessagePipeSubscribeApp,Publish项目用于发布消息,Subscribe项目用于接收消息。项目采用Prism框架进行搭建。通过重载的CreateContainerExtension方法中进行依赖注入。两个项目对MessagePipe功能注入代码如下:Publish项目代码:

var services = new ServiceCollection();
services
    .AddMessagePipe()
    .AddUdpInterprocess(
        "127.0.0.1",
        3215,
        options =>
        {
            options.InstanceLifetime = InstanceLifetime.Singleton;
        }
    );

Subscribe项目代码:

var services = new ServiceCollection();
services
    .AddMessagePipe()
    .AddUdpInterprocess(
        "127.0.0.1",
        3215,
        options =>
        {
            options.InstanceLifetime = InstanceLifetime.Singleton;
        }
    );
2.2 实现代码

两个项目通过构造函数注入方式注入IDistributedPublisher接口。

Publish项目,通过一个按钮的命令实现发送消息的功能:实现代码如下:

[RelayCommand]
 private async Task PublishAsync()
 {
     await _distributedPublisher.PublishAsync(
         "abc",
         $"Message:{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"
     );
 }

按钮点击一次,发送一次消息。Subscribe项目中在窗口的Loaded方法中进行实现对订阅消息的接收,并将消息添加到列表中进行展示。

[RelayCommand]
private async Task LoadedAsync()
{
    await _distributedSubscriber.SubscribeAsync(
        "abc",
        message =>
        {
            Application.Current.Dispatcher.InvokeAsync(() =>
            {
                Messages.Add(message);
            });
        }
    );
}
2.3 运行效果
75bb1fa9578cdfd0d9be00c4bce4b038.gif

2388190a29ce27c0c20866a1d71e094e.jpeg

3b27ba0fe3aaa9c50b3e516d12da4245.png

— END —

「扩展阅读」

Xamarin.Forms: 无限滚动的ListView(懒加载方式)

[GitHub] 75+的 C# 数据结构和算法实现

谁说.NET不适合搞BD,ML、AI

推荐一个集录屏、截图、音频于一体的软件给大家

10个用于C#.NET开发的基本调试工具

Xamarin.Forms 二维码扫描实践

在Asp.Net Core MVC 开发过程中遇到的问题总结

前端小白在asp.net core mvc中使用ECharts

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

[译]如何在C#中调试LINQ查询

C# 语言性能提升方法

使用MQTTnet搭建Mqtt服务器

OxyPlot在WinForm中的应用

「公众号推荐」

回复:「rdm」 获取Redis Desktop Manager版的安装包

回复:「redis」 获取5.0.9版的Windows安装包(exe)

回复:「ca」 获取  截图、GIF等工具三件套,便携版和安装版全部包括

「加号主回复”入群“」即可加入群聊

0cb70e3d7a704b37d6dee85047edf840.png


a24e83a6a4c341306fc3830f940298d3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值