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