Obecnie zajmuję się platformą Reactive Extensions dla .NET i przeglądam różne zasoby wprowadzające, które znalazłem (głównie http://www.introtorx.com )
Nasza aplikacja obejmuje szereg interfejsów sprzętowych, które wykrywają ramki sieciowe, będą to moje IObservables, a następnie mam różne komponenty, które będą zużywać te ramki lub przeprowadzać w jakiś sposób transformację danych i tworzyć nowy typ ramki. Będą też inne komponenty, które będą musiały wyświetlać na przykład co n-tą klatkę. Jestem przekonany, że Rx przyda się w naszej aplikacji, jednak zmagam się ze szczegółami implementacji interfejsu IObserver.
Większość (jeśli nie wszystkie) zasobów, które czytałem, mówi, że nie powinienem sam implementować interfejsu IObservable, ale używać jednej z dostarczonych funkcji lub klas. Z moich badań wynika, że utworzenie a Subject<IBaseFrame>
zapewniłoby mi to, czego potrzebuję, miałbym pojedynczy wątek, który odczytuje dane z interfejsu sprzętowego, a następnie wywołuje funkcję OnNext mojej Subject<IBaseFrame>
instancji. Różne komponenty IObserver otrzymywałyby wówczas powiadomienia od tego podmiotu.
Moje zamieszanie wynika z porady podanej w dodatku do tego samouczka, gdzie jest napisane:
Unikaj używania typów przedmiotów. Rx jest faktycznie funkcjonalnym paradygmatem programowania. Używanie podmiotów oznacza, że teraz zarządzamy stanem, który potencjalnie ulega mutacji. Radzenie sobie zarówno ze stanem mutacji, jak i programowaniem asynchronicznym w tym samym czasie jest bardzo trudne do osiągnięcia. Ponadto wiele operatorów (metod rozszerzających) zostało starannie napisanych, aby zapewnić utrzymanie prawidłowego i spójnego czasu życia subskrypcji i sekwencji; kiedy wprowadzasz przedmioty, możesz to przerwać. Przyszłe wydania mogą również spowodować znaczne obniżenie wydajności, jeśli jawnie użyjesz tematów.
Moja aplikacja jest dość krytyczna pod względem wydajności, oczywiście zamierzam przetestować wydajność korzystania z wzorców Rx, zanim przejdzie do kodu produkcyjnego; jednak martwię się, że robię coś, co jest sprzeczne z duchem frameworka Rx przy użyciu klasy Subject i że przyszła wersja frameworka zaszkodzi wydajności.
Czy jest lepszy sposób na robienie tego, co chcę? Sprzętowy wątek odpytywania będzie działał w sposób ciągły, niezależnie od tego, czy są jacyś obserwatorzy, czy nie (bufor sprzętowy będzie się archiwizował), więc jest to bardzo gorąca sekwencja. Muszę następnie przekazać odebrane ramki wielu obserwatorom.
Każda rada byłaby bardzo mile widziana.