可以跨进程或机器边界使用Reactive Extensions(Rx)吗?

依旧记得在很久以前就看到了一些关于此的讨论,但此后一直没有听到任何消息。 所以基本上你能订阅远程机器上的IObservable吗?

您可以使用IObservable.Remotable通过.NET Remoting直接从其他计算机使用observable。

在Channel 9上找到了这个很酷的video,其中一个使用IObservable.Remotable作为Paul的例子指出:

http://channel9.msdn.com/posts/J.Van.Gogh/Whats-different-about-the-3-versions-of-Rx-Part-3-NET-35-SP1/

非常有趣的东西,现在花点时间玩它吧! 😀

另一种可能的解决方案是使用命名管道。

有一个优秀的NuGet包NamedPipeWrapper ,请参阅GitHub上的源代码 。 在此上编写一个瘦的RX包装器会很容易,即订阅RX流并使用该库将消息推送到其他.NET侦听进程。

由于此解决方案使用命名管道,因此它将是一个真正的pub / sub解决方案,它将支持不同进程中的多个订阅者。

更新

在命名管道库上编写简单的RX桥接代码确实非常容易。 使用RX Subject并将RX桥接代码插入事件处理程序。 它的两端不超过4行额外的代码。 如果有人有兴趣,我可以发布代码。

更新

有关命名管道的更多信息,请参阅.NET 3.5 使用.NET 3.5命名管道IO 添加命名管道支持和进程间通信 。 前面提到的NuGet包NamedPipeWrapper是.NET 3.5引入的命名管道的内置支持的更好的版本。

是。

RX内置支持使用.NET Remoting跨越流程边界。

如果您安装NuGet软件包rx-remoting ,它将安装程序集System.Reactive.Runtime.Remoting.dll ,它提供对跨进程RX消息的支持。

有关Microsoft的演示代码,请参阅RX Across Processes 。 我刚刚测试了这个页面上的代码,它运行得很好。 为了使其编译,您需要添加以下引用:

  • NuGet : Reactive Extensions - Main Library (搜索reactive extensions main
  • NuGet : Reactive Extensions - .NET Remoting Support (搜索reactive extensions remoting
  • System.Runtime.Remoting (作为普通参考添加,此程序集附带.NET)

@theburningmonk提到的第9频道video也很有趣。

更新

不幸的是,这个解决方案有一个很大的局限性:你只能监听一个客户端进程(所有后续客户端都无法连接)。 Pushqa解决了这个问题(请参阅我的其他答案)。 本质上,任何在pub / sub信令总线上实现RX的库都应该可以解决问题。

是。

看看Pushqa 。

  • 它易于使用。 我在大约5分钟内跑了起来。
  • 它适用于C#.NET,WPF,ASP.NET或Javascript。 SignalR内置于ASP.NET中,但如果添加正确的NuGet包,它适用于任何C#.NET项目。
  • 它优于RX over .NET远程处理(参见我的其他答案),因为我们可以拥有一个服务器和许多订阅者(它是一个真正的发布/订阅模型,就像RX一样)。
  • 查询被编译到表达式树中,并在服务器上执行(最小化网络流量,因为只从服务器返回相关结果)。
    • 如果我们想要在客户端过滤查询,那么它很容易 – 只需对pushqa返回的结果进行客户端过滤。
  • 它实际上是疼痛的1%,样板代码的1%,以及Tibco可用性的10倍。 我为Tibco写了RX封套,让它变得正确是一场噩梦(Tibco的角落情况比一桶十二面体更多 )。 除非您需要连接到传统大型机客户端,或者想要通过UDP多播到数百个客户端,或者想要随意浪费国王的许可费用,否则这个解决方案远远优于Tibco。
  • 免费。
  • 它的开源。

在此处输入图像描述

没有理由不设计框架来做到这一点。 框架必须提供一种方法来处理远程对象,为它们生成代理,然后跨应用程序边界封送远程对象的活动(即通过套接字通信)。 .NET Remoting可能是实现此目的的合适选项。 WCF会更好。

您是否特意使用Rx作为问题的解决方案? WCF提供双工服务,客户端可以将回调端点注册到服务。 然后,服务可以根据需要向其客户端发起回叫。 它实际上是一种远程观察者模式。 如果RX是必须的,那么使用RX支持框架包装WCF双工服务应该是相当紧凑的,允许您的客户端“透明地”观察IObservable的服务行为。