No momento, estou começando a me familiarizar com a estrutura Reactive Extensions para .NET e estou trabalhando nos vários recursos de introdução que encontrei (principalmente http://www.introtorx.com )
Nosso aplicativo envolve uma série de interfaces de hardware que detectam quadros de rede, esses serão meus IObservables, então tenho uma variedade de componentes que consumirão esses quadros ou realizarão alguma forma de transformação nos dados e produzirão um novo tipo de quadro. Haverá também outros componentes que precisam ser exibidos a cada enésima moldura, por exemplo. Estou convencido de que Rx será útil para nossa aplicação, mas estou lutando com os detalhes de implementação para a interface IObserver.
A maioria (senão todos) dos recursos que tenho lido disseram que não devo implementar a interface IObservable sozinho, mas usar uma das funções ou classes fornecidas. De minha pesquisa, parece que a criação de um Subject<IBaseFrame>
forneceria o que eu preciso, eu teria meu único thread que lê dados da interface de hardware e, em seguida, chama a função OnNext da minha Subject<IBaseFrame>
instância. Os diferentes componentes IObserver, então, receberiam suas notificações desse Assunto.
Minha confusão vem do conselho dado no apêndice deste tutorial, onde diz:
Evite o uso dos tipos de assunto. Rx é efetivamente um paradigma de programação funcional. Usar assuntos significa que agora estamos gerenciando o estado, que é potencialmente mutante. Lidar com o estado mutante e a programação assíncrona ao mesmo tempo é muito difícil de acertar. Além disso, muitos dos operadores (métodos de extensão) foram cuidadosamente escritos para garantir que a vida útil correta e consistente das assinaturas e sequências seja mantida; quando você apresenta assuntos, você pode quebrar isso. Versões futuras também podem sofrer degradação significativa de desempenho se você usar assuntos explicitamente.
Meu aplicativo é bastante crítico para o desempenho, obviamente vou testar o desempenho de usar os padrões Rx antes de entrar no código de produção; no entanto, estou preocupado por estar fazendo algo que vai contra o espírito do framework Rx usando a classe Subject e que uma versão futura do framework vá prejudicar o desempenho.
Existe uma maneira melhor de fazer o que eu quero? O encadeamento de sondagem de hardware será executado continuamente, haja observadores ou não (o buffer de HW fará backup de outra forma), portanto, esta é uma sequência muito quente. Preciso então passar os quadros recebidos para vários observadores.
Qualquer conselho seria muito apreciado.