В настоящее время я занимаюсь фреймворком Reactive Extensions для .NET и прорабатываю различные вводные ресурсы, которые я нашел (в основном http://www.introtorx.com )
Наше приложение включает в себя несколько аппаратных интерфейсов, которые обнаруживают сетевые фреймы, это будут мои IObservables, а затем у меня будет множество компонентов, которые будут использовать эти фреймы или выполнять какое-либо преобразование данных и создавать новый тип фрейма. Также будут другие компоненты, которые, например, должны отображать каждый n-й кадр. Я убежден, что Rx будет полезен для нашего приложения, однако я борюсь с деталями реализации интерфейса IObserver.
В большинстве (если не во всех) ресурсов, которые я читал, говорится, что я не должен сам реализовывать интерфейс IObservable, а должен использовать одну из предоставленных функций или классов. Из моих исследований видно, что создание a Subject<IBaseFrame>
предоставит мне то, что мне нужно, у меня будет мой единственный поток, который считывает данные с аппаратного интерфейса, а затем вызывает функцию OnNext моего Subject<IBaseFrame>
экземпляра. Затем различные компоненты IObserver будут получать свои уведомления от этого субъекта.
Мое замешательство вызвано советом, приведенным в приложении к этому руководству, где говорится:
Избегайте использования тематических типов. Rx - это, по сути, парадигма функционального программирования. Использование субъектов означает, что теперь мы управляем состоянием, которое потенциально может изменяться. Правильно справиться и с изменяющимся состоянием, и с асинхронным программированием одновременно очень сложно. Более того, многие операторы (методы расширения) были тщательно написаны, чтобы обеспечить правильное и постоянное время жизни подписок и последовательностей; когда вы вводите предметы, вы можете сломать это. В будущих выпусках также может наблюдаться значительное снижение производительности, если вы явно используете темы.
Мое приложение весьма критично к производительности, я, очевидно, собираюсь протестировать производительность использования шаблонов Rx, прежде чем оно попадет в производственный код; однако меня беспокоит, что я делаю что-то, что противоречит духу структуры Rx, используя класс Subject, и что будущая версия инфраструктуры может снизить производительность.
Есть ли лучший способ делать то, что я хочу? Поток аппаратного опроса будет работать постоянно, независимо от того, присутствуют ли какие-либо наблюдатели или нет (в противном случае будет выполнено резервное копирование HW-буфера), так что это очень горячая последовательность. Затем мне нужно передать полученные кадры нескольким наблюдателям.
Любой совет будет очень признателен.