Poprzednia część artykułu poświęconego Reactive Extensions (RX) dla .NET została zakończona prostym przykładem, w którym prostą obserwację kolekcji przeprowadzono nie tylko w ramach wątku bieżącego, ale również na odrębnym wątku. W tym celu wykorzystano jednego z wielu planistów (scheduler'ów) dostępnych w ramach RX. Przyjrzyjmy się im trochę bliżej.
Otóż w Reactive Extension dla .NET można w bardzo prosty sposób sterować, na jakim wątku „pracuje” obserwowana kolekcja lub przy pomocy jakiego wątku chcemy ją obserwować. W tym celu wystarczy przekazać odpowiedniego planistę (lub kto woli z j. ang. Scheduler'a) do funkcji tworzącej obserwowaną kolekcję (np. tak jak to zostało zrobione w pokazanym wcześniej przykładzie, czyli .ToObservable( Scheduler.NewThread )) lub podczas tworzenia subskrypcji ustawiamy, na jakim wątku chcemy obserwować (np. poprzez dopisanie: .ObserveOn(DispatcherScheduler.Instance)).
Wśród dostępnych w RX (System.Reactive.dll) planistów wyróżnić można:
- CurrentThreadScheduler, dostępny jako Scheduler.CurrentThread – planista (scheduler), który szereguje pracę na bieżącym wątku, jak tylko będzie to możliwe.
- ImmediateScheduler, dostępny jako Scheduler.Immediate – planista, który szereguje pracę natychmiast na bieżącym wątku.
- NewThreadScheduler, dostępny jako Scheduler.NewThread – planista, który szereguje pracę na nowym wątku.
- TaskPoolScheduler, dostępny jako Scheduler.TaskPool – planista, który szereguje pracę na puli wątków związanych z Task Factory.
- ThreadPoolScheduler, dostępny jako Scheduler.ThreadPool – planista, który szereguje pracę w ramach ThreadPool.
Oprócz nich warto również zwrócić uwagę na innych, które są dostępne w ramach osobnych bibliotek, czyli np.:
- System.Reactive.Windows.Threading.dll: DispatcherScheduler – planista szereguje pracę, by była wykonana w wątku Dispatcher’a.
- System.Reactive.Windows.Forms.dll: ControlScheduler – planista szereguje pracę w wątku, który obsługuje kontrolki Windows Forms.
Wspomniane dwa ostatnie mogą się okazać nieocenionym pomocnikiem, kiedy będziemy tworzyć aplikację, w której strumienie danych lub inne obserwowane zdarzenia będą musiały wchodzić w interakcję z interfejsem użytkownika. Nie zapominajmy bowiem, że wszelkie aktualizację kontrolek WinForms lub WPF należy wykonywać z wątku, które te kontrolki wytworzył. RX upraszcza to zadanie poprzez możliwość wskazania tylko odpowiedniego planisty.
Reasumując, Reactive Extension dla .NET, to nie tylko udogodnienia związane ze zmienionym sposobem pozyskiwania danych, ale również zbiór ułatwień dla wsparcia tworzenia oprogramowania wielowątkowego.
Tych, których nie znudziła niniejsza, dość teoretyczna część, zapraszam do kolejnej części artykułu już wkrótce.
Brak komentarzy:
Prześlij komentarz