2010-07-08 42 views

回答

7

您可以使用IObservable.Remotable通过.NET Remoting直接从其他机器使用observables。

+0

嗨保罗,你有链接到某种文章,解释它是什么以及它是如何工作的? – theburningmonk 2010-07-09 14:21:46

+0

http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.71).aspx描述了远程处理 - 但请注意,当涉及到版本控制时,Remoting有一些非常重要的注意事项(例如,计算机A已经构建1004和计算机B有1007 =>应用程序坏了) – 2010-07-09 15:30:44

+0

谢谢,实际上我正在寻找IObservable.Remotable的例子,因为我还没有碰到它的前一版本的Rx :-P无论如何,在Channel9视频中找到它我在 – theburningmonk 2010-07-10 08:55:00

0

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

+0

因此,现在框架的立场,你不能只调用一个远程服务器,并获得一个IObservable并订阅它?这是有道理的,因为Rx需要知道在哪里以及如何进行回调,而且肯定无法神奇地将它们自行排除!大声笑 – theburningmonk 2010-07-08 11:01:13

+0

是的,这是它的要义。 – Jacob 2010-07-08 18:28:21

0

您是否特别接受使用Rx作为解决方案? WCF提供双工服务,客户可以将回调端点注册到服务。如有必要,服务可能会启动回呼客户。它实际上是一个远程观察者模式。如果RX是必须的,那么使用RX支持框架来包装WCF双工服务应该是相当困难的,允许客户“透明”地观察IObservable的服务行为。

+0

以下发布我们并不一定会使用Rx作为解决方案,只是探索不同的可能性。一个双工WCF服务也弹出来了,但是能够使用Rx处理更复杂的复合事件会很好。 – theburningmonk 2010-07-09 14:24:38

2

是的。

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提到的Channel 9视频也很有趣。

更新

Unfortuantely,这种解决方案有一个大的限制:你只能有一个客户端程序监听(所有后续的客户端无法连接)。 Pushqa解决了这个问题(请参阅我的其他答案)。实质上,任何在pub/sub信号总线上实现RX的库都应该这样做。

2

是的。

结账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。
  • 其免费。
  • 其开源。

enter image description here

3

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

有一个很好的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引入的命名管道内置支持的更好版本。