探索 Rx 中的主要介面
本主題描述用來表示可觀察序列並訂閱它們的主要反應式擴充功能 (Rx) 介面。
IObservable < T > /IObserver < T > 介面可在 .NET Framework 4.0 基類庫中使用,而且它們隨附可在 .NET 3.5、Silverlight 3 和 4 以及 JAVAscript 中安裝的套件。
IObservable < T > /IObserver < T>
Rx 會在 .NET Framework 4.0 中,將非同步和事件型資料來源公開為推送式、可觀察序列,由新的 IObservable < T > 介面所抽象化。 這個 IObservable < T > 介面是用於提取型可列舉集合的熟悉 IEnumerable < T > 介面的雙重。 它代表可以觀察的資料來源,這表示它可以將資料傳送給感興趣的任何人。 它會維護代表這類相關接聽程式的相依 IObserver < T > 實作清單,並自動通知它們任何狀態變更。
IObservable < T > 介面的實作可以視為 T 類型的專案集合。因此,IObservable < int > 可以檢視為整數集合,其中整數會推送至訂閱的觀察者。
如 What is Rx所述,推送模型的另一半是由 IObserver < T > 介面表示,這代表透過訂用帳戶註冊興趣的觀察者。 專案隨後會從其訂閱的可觀察序列傳送給觀察者。
若要從可觀察的集合接收通知,您可以使用 IObservable 的 Subscribe 方法將 IObserver < T > 物件交給它。 針對這個觀察者傳回時,Subscribe 方法會傳回 IDisposable 物件,做為訂閱的控制碼。 這可讓您在完成之後清除訂用帳戶。 在此物件上呼叫 Dispose 會將觀察者與來源中斷連結,以便不再傳遞通知。 如您所推斷,在 Rx 中,您不需要在 .NET 事件模型中明確取消訂閱事件。
觀察者支援三個發行集事件,由介面的 方法反映。 當可觀察的資料來源有可用的資料時,OnNext 可以呼叫零次或多次。 例如,用於滑鼠移動事件的可觀察資料來源,可以在每次移動滑鼠時傳送 Point 物件。 其他兩種方法用來表示完成或錯誤。
下列列出 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 也提供 Subscribe 擴充方法,讓您避免自行實作 IObserver < T > 介面。 對於每個發行集事件 (OnNext、OnError、OnCompleted) 可觀察序列,您可以指定將叫用的委派,如下列範例所示。 如果您未指定事件的動作,就會發生預設行為。
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"));
您可以將可觀察序列視為正常集合, (例如滑鼠停留事件的序列) 。 因此,您可以透過集合撰寫 LINQ 查詢,以執行篩選、分組、撰寫等作業。為了讓可觀察的序列更實用,Rx 元件會提供許多 Factory LINQ 運算子,因此您不需要自行實作其中任何一項。 這將會在 使用 LINQ 運算子查詢可觀察序列 主題中討論。
警告
您不需要自行實作 IObservable < T > /IObserver < T > 介面。 Rx 會為您提供這些介面的內部實作,並透過 Observable 和 Observer 類型所提供的各種擴充方法公開這些介面。 如需詳細資訊,請參閱 建立和查詢可觀察序列 主題。