ETJava Beta | Java    注册   登录
  • 搜索:
  • 使用MessagePipe实现进程间通信

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/sesametech-dotnet/p/18436641
    如有侵权 请联系我们删除  (页面底部联系我们)  

    1、MessagePipe介绍

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

    支持:

    • 依赖注入
    • 过滤器管道
    • 更好的事件
    • 同步/异步
    • 带键值的/无键值的
    • 单例/Scoped
    • 广播/响应(+更多)
    • 内存/进程间/分布式

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

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

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

    本库采用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 运行效果