C# Rx的主要接口深入理解
C# Rx的主要接口深入理解
IObservable / IObserver 接口在.NET Framework 4.0基類庫中可用,并且它們包含在可以安裝在.NET 3.5,Silverlight 3和4以及JavaScript中的包中。
IObservable/IObserver
Rx將異步和基于事件的數(shù)據(jù)源公開為基于推送的可觀察序列,由.NET Framework 4.0中的新IObservable 接口抽象。 這個(gè)IObservable 接口是用于基于拉的,可枚舉集合的熟悉的IEnumerable 接口的雙重。 它表示可以觀察到的數(shù)據(jù)源,這意味著它可以向任何有興趣的人發(fā)送數(shù)據(jù)。 它維護(hù)一個(gè)代表這種感興趣的監(jiān)聽器的依賴IObserver 實(shí)現(xiàn)的列表,并且自動(dòng)地通知它們?nèi)魏螤顟B(tài)變化。
IObservable 接口的實(shí)現(xiàn)可以被視為類型T的元素的集合。因此,IObservable 可以被視為整數(shù)的集合,其中整數(shù)將被推送到訂閱的觀察者
如“什么是Rx”中所述,推送模型的另一半由IObserver 接口表示,它表示通過訂閱注冊興趣的觀察者。 隨后將項(xiàng)目從其訂閱的可觀察序列遞送給觀察者。
為了從observable集合接收通知,您使用IObservable的Subscribe方法為其傳遞IObserver 對象。 作為對此觀察者的回報(bào),Subscribe方法返回一個(gè)IDisposable對象,作為訂閱的句柄。 這允許您在完成后清理訂閱。 在此對象上調(diào)用Dispose將觀察者從源分離,以便不再傳遞通知。 正如你可以推斷,在Rx中,不需要像.NET事件模型中那樣顯式取消訂閱事件。
觀察者支持三個(gè)發(fā)布事件,由接口的方法反映。 當(dāng)可觀察的數(shù)據(jù)源具有可用的數(shù)據(jù)時(shí),OnNext可以被調(diào)用零次或更多次。 例如,用于鼠標(biāo)移動(dòng)事件的可觀察數(shù)據(jù)源可以在每次鼠標(biāo)移動(dòng)時(shí)發(fā)出一個(gè)Point對象。 其他兩種方法用于指示完成或錯(cuò)誤。
下面列出了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擴(kuò)展方法,以便您可以自己避免實(shí)現(xiàn)IObserver 接口。 對于可觀察序列的每個(gè)發(fā)布事件(OnNext,OnError,OnCompleted),可以指定將調(diào)用的委托,如下面的示例所示。 如果不為事件指定操作,則將發(fā)生默認(rè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"));
您可以將可觀察序列(例如鼠標(biāo)懸停事件的序列)看作是正常集合。 因此,您可以在集合上編寫LINQ查詢以執(zhí)行過濾,分組,合成等操作。為了使可觀察序列更有用,Rx程序集提供了許多工廠LINQ運(yùn)算符,因此您不需要自己實(shí)現(xiàn)任何這些 。 這將在使用LINQ運(yùn)算符的查詢可觀察序列主題。
警告:
您不需要自己實(shí)現(xiàn)IObservable / IObserver 接口。 Rx為您提供這些接口的內(nèi)部實(shí)現(xiàn),并通過Observable和Observer類型提供的各種擴(kuò)展方法暴露它們。 有關(guān)詳細(xì)信息,請參閱創(chuàng)建和查詢可觀察序列主題
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
上一篇:C#圖片按比例縮放實(shí)例
欄 目:C#教程
下一篇:C# 7.0之ref locals and returns(局部變量和引用返回)
本文標(biāo)題:C# Rx的主要接口深入理解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5844.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改