Reactive Extensions 相见恨晚的Rx.Net
何為Reactive Extensions(Rx)
Rx是一個遵循函數(shù)式編程的類庫,它引用觀察者以及迭代器設計模式對可觀察對象產生的數(shù)據進行異步消費。使用Rx,開發(fā)人員將使用LINQ運算符操作異步數(shù)據流,并使用調度程序參數(shù)化異步數(shù)據流中的并發(fā)性,簡單地說,Rx = Observables + LINQ + Schedulers。
使用Rx需要Nuget安裝System.Reactive Nuget包
Rx的使用場景
響應式UI
UI界面上,用戶對一個綁定數(shù)據集合的控件進行關鍵字查詢。常規(guī)的流程是我們必須在等待用戶鍵盤按下指定的完成鍵(如回車)或鼠標點擊查詢按鈕后程序才開始執(zhí)行相應的查詢處理。但假設需求變更:“用戶希望在每輸入一個關鍵字后就能及時將關鍵字相應的查詢結果集綁定到控件” 如果面臨這個需求,那你會如何實現(xiàn)呢? 你會少不了定義相應的全局狀態(tài)字段,少不了相應的時間間隔刷新。我相信寫出來的代碼也會讓你很煩惱。 其實你有更好的選擇,那就是我們的主角Rx。
Rx 核心
Rx有兩個核心接口 IObservable<T>、IObserver<T>
IObservable<T>
先來看此接口的結構:
IObservable<T>接口就提供一個Subscribe(訂閱)方法,入參是一個觀察者對象接口。
我們可以將IObservable<T>稱之為被觀察者(可觀察者),IObserver<T>稱之為觀察者。
通過可接口簽名可以看出被觀察者需要輸出T類型的對象。需要理解被觀察者IObservable<T>我們需要與現(xiàn)有的一些常規(guī)知識點做出比較,這里我們用IEnumerable<T>比較。
我想我們都使用過Linq,操作過IEnumerable<T>集合,IEnumerable<T>集合有個明顯的狀態(tài)就是它所存儲的元素是靜態(tài)的。集合內的元素狀態(tài)除非代碼顯示的新增或刪除、修改,否則這個集合基本是靜態(tài)(數(shù)據未變動)的。但是IObservable<T>則不同,它的元素是根據被觀察者提供的數(shù)據而變動的(不可預測的),就好比在UI上你無法預測用戶的操作行為一樣。
下面這個表格可以看出兩者區(qū)別
IObservable | 可觀察對象變動的值 |
IObserver<T>
IObserver<T>接口可以理解為消費被貫徹著提供數(shù)據的一個接口,它的三個方法決定了本次數(shù)據流的觀察行為的走向。
通俗理解就是被觀察者生成數(shù)據,觀察者消費數(shù)據。
來看下IObserver<T>的結構
?
OnNext 表示消費新數(shù)據
OnError 表示觀察數(shù)據流出現(xiàn)異常
OnCompleted 表示明確關閉觀察數(shù)據流
代碼示例
下面代碼定義了一個可觀察的隊列,該隊列會提供給觀察者三個int類型的入參 1、2、3 供觀察者對象的OnNext方法消費。 MyConsoleObserver(觀察者)在得到數(shù)據后打印出來。
通過示例代碼我們得知了Rx.Net的數(shù)據流訂閱、消費流程。
Subject<T>
我們再來認識下Subject<T>,Subject是一個IObservable,它以命令形式生成一個值,并將該值推送給觀察者對象。我們看下Subject<T>的結構。
?
看這繼承關系,我們繼續(xù)看SubjectBase<T>里面有些啥~
哎呀,這個類真不得了啊,把IObserver<T>和IObservable<T>都給繼承了。這不是可以自己提供數(shù)據自己進行訂閱和消費了么....
我們來看看Subject<T>是怎么玩的:
執(zhí)行結果如下圖:
需要注意的是訂閱方法需要在數(shù)據生成前聲明。
總結
好啦,要睡覺啦,基本上Rx核心的幾個點就先講到這,我們也來總結下Rx.Net的幾個核心知識點:
可觀察(被觀察)對象生產數(shù)據;
觀察者總是被動接收數(shù)據;
需要明確訂閱后觀察者才得以消費數(shù)據;
這里也只是自己的一個學習總結,Rx也不是眼前的幾個小示例就可以一目了然,不過核心的知識基本上就是這些。至于還有一些操作符的話相信用過Linq的話上手不難,難點在于需要在實際業(yè)務中找到合適的場景使用,只有不斷使用才會融會貫通。但是任何技術都不能濫用,每一項新技術都有它最佳使用場景,優(yōu)秀的開發(fā)者需要做好權衡。
原文地址:https://www.cnblogs.com/hunanzp/p/10325454.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的Reactive Extensions 相见恨晚的Rx.Net的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒋金楠:200行代码7个对象《ASP.N
- 下一篇: 张高兴的 .NET Core IoT 入