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

时间:2010-07-08 10:10:11

标签: c# .net system.reactive

依稀记得很久以前就看到了一些关于这个问题的讨论,但从那时起就没有听到任何消息。所以你基本上可以在远程机器上订阅IObservable吗?

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

在第9频道上发现这个很酷的视频,其中一个使用 IObservable.Remotable 的例子如Paul所指出的那样:

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

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

答案 2 :(得分:4)

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

有一个优秀的NuGet包NamedPipeWrapper,请参阅source on GitHub。在这上面写一个瘦的RX包装器会很容易,即订阅RX流并使用这个库将消息推送到其他.NET监听进程。

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

<强>更新

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

<强>更新

有关命名管道的更多信息,请参阅.NET 3.5 Adds Named Pipes SupportInterprocess Communication Using .NET 3.5 Named Pipes IO。前面提到的NuGet包NamedPipeWrapper是.NET 3.5引入的命名管道的内置支持的更好的版本。

答案 3 :(得分:3)

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

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

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

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

@theburningmonk提到的第9频道视频也值得关注。

<强>更新

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

答案 4 :(得分:3)

查看Pushqa

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

enter image description here

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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