什麼時候使用RX

主旨:針對使用.net事件模式來達到異步操做的開發人員使用RX帶來的優點
RX的優點
不管是從事傳統的桌面應用程序編程仍是基於網絡的編程,你會時而不時的碰到異步操做。桌面應用程序開發確定要考慮到/O操做和前臺線程可能花費很長的時間致使其它線程阻礙。Silverlight禁止任何阻塞線程調度,因此你只能選用異步編程模型。然而如今的異步編程模型用戶必須手動的管理異常和取消事件.爲組合和過濾事件也要本身編碼來實現,這將會很難去維護和編譯。
另外,若是你的程序是多數據互相交互,傳統的解決方法是經過把每一個數據流做爲一個單獨的事件來進行管理的。例如:只要用戶按下鍵盤,一個鍵盤事件將會推送到鍵盤事件的處理方法下。在這個鍵盤事件裏面,你必須本身編碼來過濾不一樣的數據流來獲取當前事件所須要的數據。
目前,若是你想訂閱事件,首先你要先建立事件句柄,以後你就能夠訂閱這個事件,示例以下:編程

/// Declare an event
public event EventHandler<MouseEventArgs> MouseMove;
/// Publish data
MouseMove(this, args);
///Subscribe to an event
MouseMove += (sender, args) => Display(args)

 

使用Rx,你能夠處理多數據異步操做(數據能夠來自於股票,計算機,網絡等),而且訂閱事件流經過Iobserver<T>接口,接口 IObservable<T> 維護一個依賴Iobserver<T>這個接口的列表,而且當它的狀態發生改變會自動的通知它們。你能夠經過標準化隊列查詢方式(LINQ)來操做observable這個隊列。這時,你能夠容易的經過標準的LinQ操做來實現多事件的過濾,組合,聯合,執行功能。異常和取消也在RX的擴展中實現。網絡

下面的示例展現瞭如何建立一個ISubject實例來表明事件流,Isubject繼承於IObservable和IObserver這兩個接口。和上一個示例使用相同的對象參數和訂閱關係。異步

///Declare an observable
public ISubject<MouseEventArgs> MouseMove;
///Publish data
MouseMove.OnNext(args);
///Subscribe to an observable
MouseMove.Subscribe(args => Display(args));

 


此外你可使用計劃表功能來實現何是開始這種訂閱關係,或者什麼時候把通知推送給訂閱者。
過濾
傳統事件模式的一個缺點就是一但事件被引起,事件處理程序都會立馬被調用。並且事件都必須由事件源發引起而後被髮送出來。爲了讓事件處理函數只處理本身關注的數據引起的事件,必須本身在事件本身編碼來轉換數據。
如以檢測鼠標按下事件爲例,在如今的事件模型中,你必須寫事件處理程序 而且要用MouseEventArgs來做爲參數,應用程序能夠對引起事件的消息作出迴應。在RX中,鼠標按下事件被做爲一種帶有點擊信息的流進行處理。不論你何是點擊鼠標,這些信息都在準備處理的流中。經過這種範式,事件或者事件流很是像List或其它集合,這也意味着咱們能夠把操做集合的方法用來操做事件。好比,你能夠過濾掉鼠標在指定範圍以外的點擊,僅僅在範圍內的點擊才引起事件,或者你能夠計算一段時間內點擊 ,並把有效的點擊 次數做爲信息參數,相似的,你能夠關注股票在必定時間的必定範圍內的指數變化。這些經過RX很是容易實現。
經過這種方法,函數能夠接收事件處理事件並把處理事件的流傳遞給應用程序。這將帶給你在如今的編程模式中意想不到的靈活與方便。此外Rx還要充當管道功能來在後臺過濾,異步,轉換數據,你的事件處理函數只需處理收到的數據。這將會使你的代碼是乾淨,易讀和便於維護的。
組合
在如今的事件模式中,你幾乎不能組合事件。不能訂閱多下事件而且根據不一樣的事件結果來進行異步操做。在Rx中,通常的LINQ操做如SelectMany,Merge,等等已經實現的組件中,這樣操做只須要合併多個事件流去返回給訂閱者,如你能夠建立一個觀察者隊列來監聽鼠標按下和鼠標移動事件,以後你能夠訂閱這個台山觀察隊列,因此這就基本上實現了組合鼠標事件,其實也就是鼠標拖動事件。
操做事件
如今的事件模式中,事件針對與另外一個服務交互(應用程序,函數,存儲,進程)是隱藏數據源的,就像咱們前面討論的那樣,RX是作爲一個對象集合的。如,鼠標事件包含一個點值的集合,基於觀察者對象的性質,它們能夠作爲函數參數,返回值,或者存在變量中。
解除事件訂閱
如今有事件模式中,爲了中止接收事件通知,你必須明確的解除訂閱事件。RX能夠簡單的讓你在特定的時間和特定的數據源。如,當你訂閱一個觀察隊列展示的事件流時,你能夠指定你訂閱多長時間這個隊列改變或者訂閱一個時間間隔如訂閱3-5分鐘的事件流。或者其它事件發生時纔會訂閱事件。另外,當你訂閱一個觀察隊列時,你可能獲得一個IDisposable句柄經過這個句柄你能夠經過調用Dispose來解除訂閱。異步編程

源文函數

相關文章
相關標籤/搜索