Rozszerzenia reaktywne

Reaktywne rozszerzenia (Rx) to biblioteka do tworzenia programów asynchronicznych i opartych na zdarzeniach przy użyciu obserwowanych sekwencji i operatorów zapytań w stylu LINQ.

Sekwencje danych mogą przyjmować wiele formularzy, takich jak strumień danych z pliku lub usługi internetowej, żądań usług internetowych, powiadomień systemowych lub serii zdarzeń, takich jak dane wejściowe użytkownika.

Reaktywne rozszerzenia reprezentują wszystkie te sekwencje danych jako widoczne sekwencje. Aplikacja może subskrybować te widoczne sekwencje, aby otrzymywać powiadomienia asynchroniczne w miarę nadejścia nowych danych. Biblioteka Rx jest dostępna do tworzenia aplikacji klasycznych na platformie .NET. Jest on również wydany dla silverlight, Windows Phone 7 i JavaScript. Aby uzyskać więcej informacji na temat tych różnych platform, zobacz Różnice między wersjami języka Rx .

Ściąganie i wypychanie danych

W interaktywnym programowaniu aplikacja aktywnie sonduje źródło danych, aby uzyskać więcej informacji, ściągając dane z sekwencji reprezentującej źródło. Takie zachowanie jest reprezentowane przez wzorzec iteratora IEnumerable<T>/IEnumerator<T>. Interfejs IEnumerable T> uwidacznia<pojedynczą metodę GetEnumerator(), która zwraca moduł IEnumerator<T> do iterowania w tej kolekcji.  Moduł IEnumerator<T> umożliwia pobranie bieżącego elementu (przez zwrócenie właściwości Current) i określenie, czy istnieje więcej elementów do iteracji (przez wywołanie metody MoveNext). 

Aplikacja jest aktywna w procesie pobierania danych: oprócz pobierania modułu wyliczającego przez wywołanie narzędzia GetEnumerator kontroluje również tempo pobierania, wywołując metodę MoveNext we własnej wygodzie. Ten wzorzec wyliczania jest synchroniczny, co oznacza, że aplikacja może zostać zablokowana podczas sondowania źródła danych. Taki wzorzec ściągania jest podobny do odwiedzania biblioteki i wyewidencjonowania książki. Po zakończeniu pracy z książką płacisz kolejną wizytę, aby się wyewidencjonować.

Z drugiej strony w programowaniu reaktywnym aplikacja jest oferowana więcej informacji przez subskrybowanie strumienia danych (nazywanego sekwencją obserwowaną w języku Rx), a każda aktualizacja jest przekazywana ze źródła. Aplikacja jest pasywna w procesie pobierania danych: oprócz subskrybowania do widocznego źródła nie sonduje aktywnie źródła, ale jedynie reaguje na wypychane do niego dane. Gdy strumień nie ma więcej danych do zaoferowania lub gdy wystąpi błąd, źródło wyśle powiadomienie do subskrybenta. W ten sposób aplikacja nie zostanie zablokowana przez oczekiwanie na aktualizację źródła.

Jest to wzorzec wypychania używany przez rozszerzenia reaktywne. Jest ona podobna do dołączenia do klubu książki, w którym rejestrujesz zainteresowanie określonym gatunkiem, a książki zgodne z twoim zainteresowaniem są automatycznie wysyłane do Ciebie w miarę ich publikowania. Nie musisz stać w kolejce, aby uzyskać coś, co chcesz. Zastosowanie wzorca wypychania jest przydatne w wielu scenariuszach, szczególnie w środowisku ciężkim dla interfejsu użytkownika, w którym nie można zablokować wątku interfejsu użytkownika, gdy aplikacja oczekuje na niektóre zdarzenia. Jest to również niezbędne w środowiskach programistycznych, takich jak Silverlight, które mają własny zestaw wymagań asynchronicznych. Podsumowując, używając języka Rx, możesz zwiększyć czas reakcji aplikacji.

Model wypychania zaimplementowany przez język Rx jest reprezentowany przez obserwowalny wzorzec IObservable<T>/IObserver<T>. Interfejs IObservable<T> jest podwójnym znanym interfejsem IEnumerable<T> . Tworzy ona abstrakcję sekwencji danych i przechowuje listę implementacji języka T> serwera IObserver<, które są zainteresowane sekwencją danych. Funkcja IObservable powiadomi wszystkich obserwatorów automatycznie o wszelkich zmianach stanu. Aby zarejestrować zainteresowanie za pośrednictwem subskrypcji, należy użyć metody Subskrybuj obiektu IObservable, która przyjmuje serwer IObserver i zwraca wartość IDisposable. Zapewnia to możliwość śledzenia i usuwania subskrypcji. Ponadto implementacja LINQ języka Rx nad obserwowanymi sekwencjami umożliwia deweloperom tworzenie złożonych zapytań przetwarzania zdarzeń w sekwencjach opartych na wypychaniu, takich jak zdarzenia platformy .NET, obliczenia oparte na APM ("IAsyncResult"), obliczenia<> oparte na zadaniach, interfejsy API czujnika i lokalizacji systemu Windows 7, strumienie zdarzeń czasowych usługi SQL StreamInsight, zdarzenia pierwszej klasy języka F# i przepływy pracy asynchroniczne. Aby uzyskać więcej informacji na temat interfejsów T/IObserver T>>/IObserver<<, zobacz Eksplorowanie głównych interfejsów w języku Rx. Aby zapoznać się z samouczkami dotyczącymi używania różnych funkcji w języku Rx, zobacz Using Rx (Korzystanie z języka Rx).