2010-07-08 8 views

Respuesta

7

Puede usar IObservable.Remotable para usar observables directamente desde otras máquinas a través de .NET Remoting.

+0

Hola, Paul, ¿tienes un enlace a un artículo de algún tipo que explica qué es y cómo funciona? – theburningmonk

+0

http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.71).aspx describe Remoting - tenga en cuenta, sin embargo, que Remoting tiene algunas advertencias bastante importantes cuando se trata de versiones (es decir, la computadora A tiene compilación 1004 y la computadora B tiene 1007 => la aplicación está rota) –

+0

gracias, en realidad estaba buscando ejemplos de IObservable.Remotable ya que no lo he encontrado con la versión anterior de Rx :-P Lo encontré de todos modos, en el video de Channel9 Publiqué debajo – theburningmonk

0

No hay ninguna razón por la que no se pueda idear un marco para hacerlo. El marco debería proporcionar un medio para direccionar objetos remotos, generar proxies para ellos, y luego ordenar la actividad del objeto remoto a través de los límites de la aplicación (es decir, a través de la comunicación de socket). .NET Remoting puede ser una opción adecuada para implementar esto. WCF sería aún mejor.

+0

Así que, como el framework se encuentra ahora, no se puede simplemente llamar a un servidor remoto y obtener un IObservable y suscribirse a él? Lo cual tiene sentido ya que Rx necesitaría saber dónde y cómo hacer esas devoluciones de llamadas y seguramente no podrá resolverlas mágicamente por sí mismo. lol – theburningmonk

+0

Sí, eso es lo esencial. – Jacob

0

¿Está específicamente obligado a utilizar Rx como solución a su problema? WCF proporciona servicios dúplex, que tienen la capacidad para que los clientes registren puntos finales de devolución de llamada a un servicio. El servicio puede entonces iniciar llamadas a sus clientes según sea necesario. Es efectivamente un patrón de observador remoto. Si RX es obligatorio, entonces debería ser un paso adelante simplificar los servicios dúplex de WCF con un marco de soporte de RX, lo que permite a sus clientes observar el comportamiento del servicio de forma transparente con IObservable.

+0

No estamos obligados a usar Rx como la solución, simplemente explorando diferentes posibilidades. También apareció un servicio WCF dúplex, pero sería bueno poder usar Rx para manejar eventos compuestos más complejos. – theburningmonk

2

Sí.

RX tiene un soporte integrado para usar .NET Remoting para cruzar los límites del proceso.

Si instala el paquete NuGet rx-remoting, instalará el conjunto System.Reactive.Runtime.Remoting.dll que brinda soporte para mensajes RX de proceso cruzado.

Para el código de demostración de Microsoft, vea RX Across Processes. Acabo de probar el código en esta página, y funciona muy bien. Con el fin de que se compile, tendrá que añadir las siguientes referencias:

  • NuGet: Reactive Extensions - Main Library (búsqueda de reactive extensions main)
  • NuGet: Reactive Extensions - .NET Remoting Support (buscar reactive extensions remoting)
  • System.Runtime.Remoting (añadir al menos referencia normal, este ensamblaje se envía con .NET)

El video del Canal 9 mencionado por @theburningmonk también es interesante de ver.

actualización

Desafortunadamente, esta solución tiene una limitación importante: sólo se puede tener uno escucha proceso cliente (todos los clientes no pueden conectarse posteriores). Pushqa resuelve este problema (ver mi otra respuesta). Básicamente, cualquier biblioteca que implemente RX en la parte superior de un bus de señalización de pub/sub debería funcionar.

2

Sí.

Echa un vistazo Pushqa.

  • Es fácil de usar. Estuve funcionando en aproximadamente 5 minutos.
  • Funciona con C# .NET, WPF, ASP.NET o Javascript. SignalR está integrado en ASP.NET, pero funciona para cualquier proyecto C# .NET si agrega el paquete NuGet correcto.
  • Es superior a RX sobre .NET remoto (ver mi otra respuesta), ya que podemos tener un servidor y muchos suscriptores (es un verdadero modelo de pub/sub, al igual que RX).
  • Las consultas se compilan en árboles de expresiones y se ejecutan en el servidor (lo que minimiza el tráfico de red, ya que solo se obtienen resultados relevantes del servidor).
    • Si queremos que las consultas se filtren por el lado del cliente, entonces es fácil - solo haga un filtro del lado del cliente en los resultados devueltos por pushqa.
  • Literalmente es 1% del dolor, 1% del código repetitivo, y 10 veces la facilidad de uso de Tibco. Escribí envoltorios RX para Tibco y fue una pesadilla corregirlo (Tibco tiene más corner cases que una tina de dodecahedrons). A menos que necesite conectarse a clientes heredados de mainframe, o desee multidifundir a cientos de clientes a través de UDP, o desee perder un rey al azar en tarifas de licencia, esta solución es muy superior a Tibco.
  • Es gratis.
  • Su fuente abierta.

enter image description here

3

Otra posible solución podría ser el uso de canalizaciones con nombre.

Hay un excelente paquete NuGet NamedPipeWrapper, consulte el source on GitHub. Sería fácil escribir un envoltorio de RX delgado sobre esto, es decir, suscribirse al flujo RX y enviar los mensajes a otros procesos de escucha .NET utilizando esta biblioteca.

Como esta solución utiliza canalizaciones con nombre, sería una verdadera solución de pub/sub que podría admitir múltiples suscriptores en diferentes procesos.

actualización

hecho, es muy fácil escribir código simple puente RX sobre la biblioteca de canalizaciones con nombre. Use un RX Subject e inserte el código del puente RX en los controladores de eventos. No hay más de 4 líneas de código adicional en ambos extremos. Puedo publicar el código si alguien está interesado.

actualización

Para obtener más información sobre canalizaciones con nombre, consulte .NET 3.5 Adds Named Pipes Support y Interprocess Communication Using .NET 3.5 Named Pipes IO. El ya mencionado paquete NuGet NamedPipeWrapper es una versión mucho más bonita del soporte integrado para conductos con nombre que se introdujo .NET 3.5.

Cuestiones relacionadas