Reaktivní rozšíření

Reactive Extensions (Rx) je knihovna pro vytváření asynchronních programů a programů založených na událostech pomocí pozorovatelných sekvencí a operátorů dotazů ve stylu LINQ.

Sekvence dat mohou mít mnoho podob, například datový proud ze souboru nebo webové služby, požadavky na webové služby, systémová oznámení nebo řadu událostí, jako je vstup uživatele.

Reactive Extensions představuje všechny tyto datové sekvence jako pozorovatelné sekvence. Aplikace se může přihlásit k odběru těchto pozorovatelných sekvencí a přijímat asynchronní oznámení při příchodu nových dat. Knihovna Rx je k dispozici pro vývoj desktopových aplikací v .NET. Je také vydán pro Silverlight, Windows Phone 7 a JavaScript. Další informace o těchto různých platformách najdete v tématu Rozdíly mezi verzemi Rx .

Načítání vs. nahánění dat

V interaktivním programování se aplikace aktivně dotazuje zdroje dat na další informace tím, že načítá data ze sekvence, která představuje zdroj. Takové chování je reprezentováno vzorem iterátoru IEnumerable<T>/IEnumerator<T>. Rozhraní IEnumerable<T> zveřejňuje jednu metodu GetEnumerator(), která vrací IEnumerator<T> iterovat prostřednictvím této kolekce.  IEnumerator<T> nám umožňuje získat aktuální položku (vrácením Current vlastnost) a určit, zda existuje více položek iterace (voláním Metody MoveNext). 

Aplikace je aktivní v procesu načítání dat: kromě získání enumerátoru voláním GetEnumerator, řídí také rychlost načítání voláním MoveNext podle vlastního pohodlí. Tento vzor výčtu je synchronní, což znamená, že aplikace může být při dotazování zdroje dat blokovaná. Tento vzor pullingu se podobá návštěvě knihovny a rezervaci knihy. Poté, co jste s knihou hotovi, navštívíte další návštěvu a podívejte se na další.

Na druhou stranu při reaktivním programování se aplikaci nabízí více informací po přihlášení k odběru datového streamu (v Rx označovaného jako pozorovatelná sekvence) a každá aktualizace se jí předá ze zdroje. Aplikace je v procesu načítání dat pasivní: kromě přihlášení k odběru pozorovatelného zdroje se aktivně netáže na zdroj, ale pouze reaguje na data, která jsou do něj vložena. Pokud stream nemá žádná další data, která by nabízel, nebo když dojde k chybě, zdroj pošle odběrateli oznámení. Tímto způsobem nebude aplikace blokována čekáním na aktualizaci zdroje.

Toto je model nabízení, který používají reaktivní rozšíření. Je to podobné, jako když se připojíte ke knižní klubu, ve kterém zaregistrujete svůj zájem v určitém žánru, a knihy, které odpovídají vašemu zájmu, se vám automaticky posílají při jejich publikování. Nemusíte stát ve frontě, abyste získali něco, co chcete. Použití vzoru nabízení je užitečné v mnoha scénářích, zejména v prostředí s velkými nároky na uživatelské rozhraní, ve kterém není možné blokovat vlákno uživatelského rozhraní, zatímco aplikace čeká na některé události. To je také nezbytné v programovacích prostředích, jako je Silverlight, který má vlastní sadu asynchronních požadavků. Když to shrneme, pomocí Rx můžete aplikaci lépe reagovat.

Model nabízení implementovaný pomocí Rx je reprezentován pozorovatelným vzorem IObservable<T>/IObserver<T>. IObservable<T> rozhraní je duální známé rozhraní IEnumerable<T> . Abstrahuje sekvenci dat a uchovává seznam implementací IObserver<T> , které se zajímají o sekvenci dat. IObservable automaticky upozorní všechny pozorovatele na všechny změny stavu. Pokud chcete zaregistrovat zájem prostřednictvím předplatného, použijete metodu Subscribe iObservable, která převezme IObserver a vrátí IDisposable. Získáte tak možnost předplatného sledovat a odstranit. Kromě toho implementace LINQ jazyka Rx přes pozorovatelné sekvence umožňuje vývojářům vytvářet složité dotazy zpracování událostí přes sekvence založené na nabízených oznámeních, jako jsou události .NET, výpočty založené na APM ("IAsyncResult"), výpočty založené na úlohách<T>, rozhraní API pro senzory a umístění windows 7, dočasné streamy událostí SQL StreamInsight, události první třídy jazyka F# a asynchronní pracovní postupy. Další informace o rozhraních IObservable<T>/IObserver<T> najdete v tématu Zkoumání hlavních rozhraní v jazyce Rx. Kurzy týkající se používání různých funkcí v Rx najdete v tématu Použití jazyka Rx.