Attualmente sto prendendo confidenza con il framework Reactive Extensions per .NET e sto lavorando a modo mio attraverso le varie risorse introduttive che ho trovato (principalmente http://www.introtorx.com )
La nostra applicazione coinvolge una serie di interfacce hardware che rilevano i frame di rete, questi saranno i miei IObservables, quindi ho una varietà di componenti che consumeranno quei frame o eseguiranno un qualche modo di trasformazione sui dati e produrranno un nuovo tipo di frame. Ci saranno anche altri componenti che devono visualizzare, ad esempio, ogni ennesimo fotogramma. Sono convinto che Rx sarà utile per la nostra applicazione, tuttavia sto lottando con i dettagli di implementazione per l'interfaccia IObserver.
La maggior parte (se non tutte) delle risorse che ho letto hanno detto che non dovrei implementare l'interfaccia IObservable da solo, ma utilizzare una delle funzioni o classi fornite. Dalla mia ricerca sembra che la creazione di un Subject<IBaseFrame>
mi fornisca ciò di cui ho bisogno, avrei il mio singolo thread che legge i dati dall'interfaccia hardware e quindi chiama la funzione OnNext della mia Subject<IBaseFrame>
istanza. I diversi componenti di IObserver riceveranno quindi le loro notifiche da quell'oggetto.
La mia confusione viene dal consiglio dato nell'appendice di questo tutorial dove dice:
Evita l'uso dei tipi di soggetto. Rx è effettivamente un paradigma di programmazione funzionale. Usare i soggetti significa che ora stiamo gestendo lo stato, che è potenzialmente in mutamento. Affrontare contemporaneamente lo stato mutante e la programmazione asincrona è molto difficile da ottenere. Inoltre, molti degli operatori (metodi di estensione) sono stati scritti con cura per garantire il mantenimento di una durata corretta e coerente di abbonamenti e sequenze; quando introduci argomenti, puoi romperlo. Le versioni future potrebbero anche vedere una riduzione significativa delle prestazioni se si utilizzano esplicitamente i soggetti.
La mia applicazione è piuttosto critica per le prestazioni, ovviamente testerò le prestazioni dell'utilizzo dei pattern Rx prima che entri nel codice di produzione; tuttavia sono preoccupato di fare qualcosa che è contro lo spirito del framework Rx utilizzando la classe Subject e che una versione futura del framework possa danneggiare le prestazioni.
C'è un modo migliore per fare quello che voglio? Il thread di polling hardware verrà eseguito continuamente indipendentemente dal fatto che ci siano osservatori o meno (altrimenti il buffer HW eseguirà il backup), quindi questa è una sequenza molto calda. Devo quindi trasmettere i frame ricevuti a più osservatori.
Qualsiasi consiglio sarebbe molto apprezzato.