C# Rx的主要接口深入理解。本站提示廣大學習愛好者:(C# Rx的主要接口深入理解)文章只能為提供參考,不一定能成為您想要的結果。以下是C# Rx的主要接口深入理解正文
C# Rx的主要接口深入理解
IObservable / IObserver 接口在.NET Framework 4.0基類庫中可用,並且它們包含在可以安裝在.NET 3.5,Silverlight 3和4以及JavaScript中的包中。
IObservable/IObserver
Rx將異步和基於事件的數據源公開為基於推送的可觀察序列,由.NET Framework 4.0中的新IObservable 接口抽象。 這個IObservable 接口是用於基於拉的,可枚舉集合的熟悉的IEnumerable 接口的雙重。 它表示可以觀察到的數據源,這意味著它可以向任何有興趣的人發送數據。 它維護一個代表這種感興趣的監聽器的依賴IObserver 實現的列表,並且自動地通知它們任何狀態變化。
IObservable 接口的實現可以被視為類型T的元素的集合。因此,IObservable 可以被視為整數的集合,其中整數將被推送到訂閱的觀察者
如“什麼是Rx”中所述,推送模型的另一半由IObserver 接口表示,它表示通過訂閱注冊興趣的觀察者。 隨後將項目從其訂閱的可觀察序列遞送給觀察者。
為了從observable集合接收通知,您使用IObservable的Subscribe方法為其傳遞IObserver 對象。 作為對此觀察者的回報,Subscribe方法返回一個IDisposable對象,作為訂閱的句柄。 這允許您在完成後清理訂閱。 在此對象上調用Dispose將觀察者從源分離,以便不再傳遞通知。 正如你可以推斷,在Rx中,不需要像.NET事件模型中那樣顯式取消訂閱事件。
觀察者支持三個發布事件,由接口的方法反映。 當可觀察的數據源具有可用的數據時,OnNext可以被調用零次或更多次。 例如,用於鼠標移動事件的可觀察數據源可以在每次鼠標移動時發出一個Point對象。 其他兩種方法用於指示完成或錯誤。
下面列出了IObservable / IObserver 接口。
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 接口。 對於可觀察序列的每個發布事件(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程序集提供了許多工廠LINQ運算符,因此您不需要自己實現任何這些 。 這將在使用LINQ運算符的查詢可觀察序列主題。
警告:
您不需要自己實現IObservable / IObserver 接口。 Rx為您提供這些接口的內部實現,並通過Observable和Observer類型提供的各種擴展方法暴露它們。 有關詳細信息,請參閱創建和查詢可觀察序列主題
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
[db:作者簡介][db:原文翻譯及解析]