溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Rx.Net的核心知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2022-01-05 16:42:36 來(lái)源:億速云 閱讀:302 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)Rx.Net的核心知識(shí)點(diǎn)有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

何為Reactive Extensions(Rx)

Rx是一個(gè)遵循函數(shù)式編程的類庫(kù),它引用觀察者以及迭代器設(shè)計(jì)模式對(duì)可觀察對(duì)象產(chǎn)生的數(shù)據(jù)進(jìn)行異步消費(fèi)。使用Rx,開(kāi)發(fā)人員將使用LINQ運(yùn)算符操作異步數(shù)據(jù)流,并使用調(diào)度程序參數(shù)化異步數(shù)據(jù)流中的并發(fā)性,簡(jiǎn)單地說(shuō),Rx = Observables + LINQ + Schedulers。

使用Rx需要Nuget安裝System.Reactive Nuget包

Rx的使用場(chǎng)景

響應(yīng)式UI

UI界面上,用戶對(duì)一個(gè)綁定數(shù)據(jù)集合的控件進(jìn)行關(guān)鍵字查詢。常規(guī)的流程是我們必須在等待用戶鍵盤(pán)按下指定的完成鍵(如回車)或鼠標(biāo)點(diǎn)擊查詢按鈕后程序才開(kāi)始執(zhí)行相應(yīng)的查詢處理。但假設(shè)需求變更:“用戶希望在每輸入一個(gè)關(guān)鍵字后就能及時(shí)將關(guān)鍵字相應(yīng)的查詢結(jié)果集綁定到控件” 如果面臨這個(gè)需求,那你會(huì)如何實(shí)現(xiàn)呢? 你會(huì)少不了定義相應(yīng)的全局狀態(tài)字段,少不了相應(yīng)的時(shí)間間隔刷新。我相信寫(xiě)出來(lái)的代碼也會(huì)讓你很煩惱。 其實(shí)你有更好的選擇,那就是我們的主角Rx。

Rx 核心

Rx有兩個(gè)核心接口 IObservable<T>、IObserver<T>

IObservable<T>

先來(lái)看此接口的結(jié)構(gòu):

Rx.Net的核心知識(shí)點(diǎn)有哪些

IObservable<T>接口就提供一個(gè)Subscribe(訂閱)方法,入?yún)⑹且粋€(gè)觀察者對(duì)象接口
我們可以將IObservable<T>稱之為被觀察者(可觀察者),IObserver<T>稱之為觀察者

通過(guò)可接口簽名可以看出被觀察者需要輸出T類型的對(duì)象。需要理解被觀察者IObservable<T>我們需要與現(xiàn)有的一些常規(guī)知識(shí)點(diǎn)做出比較,這里我們用IEnumerable<T>比較。
我想我們都使用過(guò)Linq,操作過(guò)IEnumerable<T>集合,IEnumerable<T>集合有個(gè)明顯的狀態(tài)就是它所存儲(chǔ)的元素是靜態(tài)的。集合內(nèi)的元素狀態(tài)除非代碼顯示的新增或刪除、修改,否則這個(gè)集合基本是靜態(tài)(數(shù)據(jù)未變動(dòng))的。但是IObservable<T>則不同,它的元素是根據(jù)被觀察者提供的數(shù)據(jù)而變動(dòng)的(不可預(yù)測(cè)的),就好比在UI上你無(wú)法預(yù)測(cè)用戶的操作行為一樣。

下面這個(gè)表格可以看出兩者區(qū)別

IEnumerable

可方便的列舉集合元素值

IObservable

可觀察對(duì)象變動(dòng)的值

IObserver<T>

IObserver<T>接口可以理解為消費(fèi)被貫徹著提供數(shù)據(jù)的一個(gè)接口,它的三個(gè)方法決定了本次數(shù)據(jù)流的觀察行為的走向。
通俗理解就是被觀察者生成數(shù)據(jù),觀察者消費(fèi)數(shù)據(jù)。

來(lái)看下IObserver<T>的結(jié)構(gòu)

Rx.Net的核心知識(shí)點(diǎn)有哪些

  • OnNext 表示消費(fèi)新數(shù)據(jù)

  • OnError 表示觀察數(shù)據(jù)流出現(xiàn)異常

  • OnCompleted 表示明確關(guān)閉觀察數(shù)據(jù)流

代碼示例

下面代碼定義了一個(gè)可觀察的隊(duì)列,該隊(duì)列會(huì)提供給觀察者三個(gè)int類型的入?yún)?1、2、3 供觀察者對(duì)象的OnNext方法消費(fèi)。 MyConsoleObserver(觀察者)在得到數(shù)據(jù)后打印出來(lái)。

Rx.Net的核心知識(shí)點(diǎn)有哪些

Rx.Net的核心知識(shí)點(diǎn)有哪些

通過(guò)示例代碼我們得知了Rx.Net的數(shù)據(jù)流訂閱、消費(fèi)流程。

Subject<T>

我們?cè)賮?lái)認(rèn)識(shí)下Subject<T>,Subject是一個(gè)IObservable,它以命令形式生成一個(gè)值,并將該值推送給觀察者對(duì)象。我們看下Subject<T>的結(jié)構(gòu)。

Rx.Net的核心知識(shí)點(diǎn)有哪些

看這繼承關(guān)系,我們繼續(xù)看SubjectBase<T>里面有些啥~

Rx.Net的核心知識(shí)點(diǎn)有哪些

哎呀,這個(gè)類真不得了啊,把IObserver<T>和IObservable<T>都給繼承了。這不是可以自己提供數(shù)據(jù)自己進(jìn)行訂閱和消費(fèi)了么....
我們來(lái)看看Subject<T>是怎么玩的:

Rx.Net的核心知識(shí)點(diǎn)有哪些

執(zhí)行結(jié)果如下圖:

Rx.Net的核心知識(shí)點(diǎn)有哪些

需要注意的是訂閱方法需要在數(shù)據(jù)生成前聲明。

關(guān)于Rx.Net的核心知識(shí)點(diǎn)有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI