1、MessagePipe介绍
可以用于.NET和Unity上面的高性能的内存/分布式消息传递管道。适用于发布/订阅模式、CQRS的中介模式、Prism中的EventAggregator、IPC(进程间通信)-RPC等。
支持:
- 依赖注入
- 过滤器管道
- 更好的事件
- 同步/异步
- 带键值的/无键值的
- 单例/Scoped
- 广播/响应(+更多)
- 内存/进程间/分布式
MessagePipe 比标准的 C# event更快,是Prism的EventAggregator的78倍。下面是官方给出的测试截图

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

还提供了Roslyn分析器以防止订阅泄露。

本库采用MIT协议
2、MessagePipe分布式发布/订阅的使用(进程间通信)
2.1 新建两个Wpf项目
项目名称分别为:MessagePipePublishApp和MessagePipeSubscribeApp,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 运行效果
