11

隐约记得很久以前看到过一些关于这个的讨论,但从那以后就再也没有听到过任何消息。所以基本上你可以在远程机器上订阅一个 IObservable 吗?

4

7 回答 7

8

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

于 2010-07-09T05:15:24.387 回答
5

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

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

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

更新

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

更新

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

于 2014-11-01T22:51:00.263 回答
4

在 Channel 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

于 2010-07-09T15:26:59.797 回答
3

是的。

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 频道视频也很有趣。

更新

不幸的是,这种解决方案有一个很大的限制:您只能让一个客户端进程监听(所有后续客户端都无法连接)。Pushqa解决了这个问题(见我的另一个答案)。本质上,任何在 pub/sub 信号总线之上实现 RX 的库都应该可以解决问题。

于 2014-10-26T17:40:53.170 回答
3

是的。

查看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。
  • 免费。
  • 它的开源。

在此处输入图像描述

于 2014-11-01T20:50:58.877 回答
0

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

于 2010-07-08T10:34:08.937 回答
0

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

于 2010-07-09T05:27:23.073 回答