隐约记得在一段时间后看到一些讨论,但从此以后一直没有听到。所以基本上你可以订阅远程机器上的IObservable吗?跨进程或机器边界可以使用反应式扩展(Rx)吗?
回答
您可以使用IObservable.Remotable通过.NET Remoting直接从其他机器使用observables。
没有理由不能为此设计框架。框架必须提供一种方法来处理远程对象,为它们生成代理,然后跨应用程序边界(即通过套接字通信)整理远程对象的活动。 .NET Remoting可能是实现此目的的合适选项。 WCF会更好。
因此,现在框架的立场,你不能只调用一个远程服务器,并获得一个IObservable并订阅它?这是有道理的,因为Rx需要知道在哪里以及如何进行回调,而且肯定无法神奇地将它们自行排除!大声笑 – theburningmonk 2010-07-08 11:01:13
是的,这是它的要义。 – Jacob 2010-07-08 18:28:21
您是否特别接受使用Rx作为解决方案? WCF提供双工服务,客户可以将回调端点注册到服务。如有必要,服务可能会启动回呼客户。它实际上是一个远程观察者模式。如果RX是必须的,那么使用RX支持框架来包装WCF双工服务应该是相当困难的,允许客户“透明”地观察IObservable的服务行为。
以下发布我们并不一定会使用Rx作为解决方案,只是探索不同的可能性。一个双工WCF服务也弹出来了,但是能够使用Rx处理更复杂的复合事件会很好。 – theburningmonk 2010-07-09 14:24:38
找到Channel 9上这部精彩的影片,其使用IObservable.Remotable保罗的例子指出:
非常有趣的东西,会花一点时间,现在玩了! :-D
是的。
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提到的Channel 9视频也很有趣。
更新
Unfortuantely,这种解决方案有一个大的限制:你只能有一个客户端程序监听(所有后续的客户端无法连接)。 Pushqa解决了这个问题(请参阅我的其他答案)。实质上,任何在pub/sub信号总线上实现RX的库都应该这样做。
是的。
结账Pushqa。
- 它易于使用。我在大约5分钟后就起来跑步了。
- 它适用于C#.NET,WPF,ASP.NET或Javascript。 SignalR内置于ASP.NET中,但如果您添加了正确的NuGet包,则它适用于任何C#.NET项目。
- 由于我们可以有一个服务器和许多订阅者(它是一个真正的pub/sub模型,就像RX一样),它优于RX over .NET远程处理(请参阅我的其他答案)。
- 将查询编译到表达式树中,并在服务器上执行(最小化网络流量,因为只从服务器返回相关结果)。
- 如果我们想要过滤客户端的查询,那么很简单 - 只需对从pushqa返回的结果执行客户端过滤。
- 它的字面意思是痛苦的1%,样板代码的1%,以及Tibco的可用性的10倍。我为Tibco写了RX包装,这是一个噩梦,让它正确(Tibco有更多corner cases比浴盆dodecahedrons)。除非您需要连接到传统大型机客户端,或者希望通过UDP向数百个客户端进行组播,或者想要随意将许多国王浪费在许可费用中,否则此解决方案远胜于Tibco。
- 其免费。
- 其开源。
另一种可能的解决办法是使用命名管道。
有一个很好的NuGet包NamedPipeWrapper,请参阅source on GitHub。在此之上编写一个精简的RX封装将很容易,即订阅RX流并使用此库将消息推送到其他.NET侦听进程。
由于此解决方案使用命名管道,它将是一个真正的发布/订阅解决方案,它将支持不同进程中的多个订户。
更新
这的确是很容易通过命名管道库编写简单的RX桥代码。使用RX Subject
并将RX桥代码插入事件处理程序。它的两端不超过4行额外的代码。如果有人感兴趣,我可以发布代码。
更新
有关命名管道的详细信息,请参阅.NET 3.5 Adds Named Pipes Support和Interprocess Communication Using .NET 3.5 Named Pipes IO。前面提到的NuGet包NamedPipeWrapper
是.NET 3.5引入的命名管道内置支持的更好版本。
嗨保罗,你有链接到某种文章,解释它是什么以及它是如何工作的? – theburningmonk 2010-07-09 14:21:46
http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.71).aspx描述了远程处理 - 但请注意,当涉及到版本控制时,Remoting有一些非常重要的注意事项(例如,计算机A已经构建1004和计算机B有1007 =>应用程序坏了) – 2010-07-09 15:30:44
谢谢,实际上我正在寻找IObservable.Remotable的例子,因为我还没有碰到它的前一版本的Rx :-P无论如何,在Channel9视频中找到它我在 – theburningmonk 2010-07-10 08:55:00