Sdílet prostřednictvím


Seznámení s hlavními rozhraními v Rx

Toto téma popisuje hlavní rozhraní reactive Extensions (Rx) sloužící k reprezentaci pozorovatelných sekvencí a jejich odběru.

Rozhraní IObservable<T>/IObserver<T> jsou k dispozici v knihovně základních tříd rozhraní .NET Framework 4.0 a dodávají se v balíčku, který lze nainstalovat v rozhraní .NET 3.5, Silverlight 3 a 4 a také v JavaScriptu.

IObservable<T>/IObserver<T>

Rx zveřejňuje asynchronní zdroje dat a zdroje dat založené na událostech jako sekvence založené na nabízených oznámeních abstrahované novým rozhraním IObservable<T> v rozhraní .NET Framework 4.0. Tento IObservable<T> rozhraní je duální známé IEnumerable<T> rozhraní, které se používá pro pull-založené, výčtové kolekce. Představuje zdroj dat, který lze pozorovat, což znamená, že může odesílat data komukoli, kdo má zájem. Udržuje seznam závislých IObserver<T> implementací představujících takové naslouchací procesy, které mají zájem, a automaticky je upozorní na jakékoli změny stavu.

Implementace rozhraní IObservable<T> lze považovat za kolekci prvků typu T. Proto lze IObservable<int> považovat za kolekci celých čísel, ve kterých budou celá čísla vložena do odebíraných pozorovatelů.

Jak je popsáno v tématu Co je Rx, druhá polovina modelu nabízení je reprezentována rozhraním IObserver<T> , které představuje pozorovatele, který registruje zájem prostřednictvím předplatného. Položky jsou následně předány pozorovateli z pozorovatelné sekvence, ke které se přihlašuje.

Chcete-li přijímat oznámení z pozorovatelné kolekce, použijete metodu Subscribe IObservable k předání objektu IObserver<T> . Na oplátku pro tohoto pozorovatele Subscribe metoda vrátí objekt IDisposable, který funguje jako popisovač pro odběr. To vám umožní vyčistit předplatné po dokončení.  Volání Dispose u tohoto objektu oddělí pozorovatele od zdroje, takže oznámení již nebudou doručována. Jak můžete odvodit, v Rx nemusíte explicitně odhlásit odběr události jako v modelu událostí .NET.

Pozorovatelé podporují tři události publikování, které odrážejí metody rozhraní. OnNext může být volán nulakrát nebo vícekrát, když pozorovatelný zdroj dat má k dispozici data. Například pozorovatelný zdroj dat používaný pro události přesunu myši může odeslat objekt Point pokaždé, když se přesune myš. Další dvě metody se používají k označení dokončení nebo chyb.

Následující seznam uvádí rozhraní IObservable<T>/IObserver<T> .

public interface IObservable<out T> 
{ 
   IDisposable Subscribe(IObserver<T> observer); 
} 
public interface IObserver<in T> 
{ 
   void OnCompleted();            // Notifies the observer that the source has finished sending messages.
   void OnError(Exception error); // Notifies the observer about any exception or error.
   void OnNext(T value);          // Pushes the next data value from the source to the observer.
} 

Rx také poskytuje rozšiřující metody Přihlášení k odběru, abyste se mohli vyhnout implementaci rozhraní IObserver<T> sami. Pro každou událost publikace (OnNext, OnError, OnCompleted) pozorovatelné sekvence můžete určit delegáta, který bude vyvolán, jak je znázorněno v následujícím příkladu. Pokud akci pro událost nezadáte, dojde k výchozímu chování.

IObservable<int> source = Observable.Range(1, 5); //creates an observable sequence of 5 integers, starting from 1
IDisposable subscription = source.Subscribe(
                            x => Console.WriteLine("OnNext: {0}", x), //prints out the value being pushed
                            ex => Console.WriteLine("OnError: {0}", ex.Message),
                            () => Console.WriteLine("OnCompleted"));

S pozorovatelnou sekvencí (například sekvencí událostí přejíždění myší) můžete zacházet, jako by šlo o normální kolekci. Proto můžete na kolekci psát dotazy LINQ, které budou provádět akce, jako je filtrování, seskupování, vytváření atd. Pro větší užitečnost pozorovatelných sekvencí poskytují sestavení Rx mnoho operátorů LINQ z výroby, takže je nemusíte implementovat sami. To bude popsáno v tématu Dotazování pozorovatelných sekvencí pomocí operátorů LINQ .

Upozornění

Rozhraní IObservable<T>/IObserver<T> nemusíte implementovat sami. Rx poskytuje interní implementace těchto rozhraní za vás a zveřejňuje je prostřednictvím různých rozšiřujících metod poskytovaných typy Pozorovatelné a Pozorovatelé. Další informace najdete v tématu Vytváření a dotazování pozorovatelných sekvencí .

Viz také

Koncepty

Dotazování pozorovatelných sekvencí pomocí operátorů LINQ

Další prostředky

Vytváření pozorovatelných sekvencí a jejich dotazování