Actualmente me estoy familiarizando con el marco de extensiones reactivas para .NET y estoy trabajando a través de los diversos recursos de introducción que he encontrado (principalmente http://www.introtorx.com )
Nuestra aplicación involucra una serie de interfaces de hardware que detectan marcos de red, estos serán mis IObservables, luego tendré una variedad de componentes que consumirán esos marcos o realizarán alguna forma de transformación en los datos y producirán un nuevo tipo de marco. También habrá otros componentes que deberán mostrar cada enésimo fotograma, por ejemplo. Estoy convencido de que Rx será útil para nuestra aplicación, sin embargo, estoy luchando con los detalles de implementación de la interfaz IObserver.
La mayoría (si no todos) de los recursos que he estado leyendo han dicho que no debería implementar la interfaz IObservable yo mismo, sino usar una de las funciones o clases proporcionadas. De mi investigación, parece que la creación de un Subject<IBaseFrame>
me proporcionaría lo que necesito, tendría mi único hilo que lee datos de la interfaz de hardware y luego llama a la función OnNext de mi Subject<IBaseFrame>
instancia. Los diferentes componentes de IObserver recibirían sus notificaciones de ese sujeto.
Mi confusión proviene del consejo que se da en el apéndice de este tutorial, donde dice:
Evite el uso de tipos de sujetos. Rx es efectivamente un paradigma de programación funcional. Usar sujetos significa que ahora estamos administrando el estado, que potencialmente está mutando. Tratar tanto con el estado mutante como con la programación asincrónica al mismo tiempo es muy difícil de hacer bien. Además, muchos de los operadores (métodos de extensión) se han escrito cuidadosamente para garantizar que se mantenga una vida útil correcta y coherente de las suscripciones y secuencias; cuando presenta los temas, puede romper esto. Las versiones futuras también pueden ver una degradación significativa del rendimiento si utiliza sujetos explícitamente.
Mi aplicación es bastante crítica para el rendimiento, obviamente voy a probar el rendimiento del uso de patrones Rx antes de que entre en el código de producción; sin embargo, me preocupa que estoy haciendo algo que va en contra del espíritu del marco Rx al usar la clase Asunto y que una versión futura del marco va a dañar el rendimiento.
¿Existe una mejor manera de hacer lo que quiero? El subproceso de sondeo de hardware se ejecutará continuamente, ya sea que haya observadores o no (el búfer de HW se respaldará de lo contrario), por lo que esta es una secuencia muy activa. Luego, necesito pasar los fotogramas recibidos a varios observadores.
Cualquier consejo será muy apreciado.