国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# 實現與現有.NET事件橋接簡單實例

2020-01-24 00:43:55
字體:
來源:轉載
供稿:網友

C# 實現與現有.NET事件橋接簡單實例

 Rx提供了工廠方法,以便與.NET中的現有異步源橋接,以便您可以使用由任何類型的數據流提供的豐富的組合,過濾和資源管理功能。 本主題檢查FromEventPattern運算符,它允許將.NET事件作為可觀察序列“導入”到Rx中。 每次引發事件時,OnNext消息將被傳遞到可觀察的序列。 然后,您可以像任何其他可觀察序列一樣處理事件數據。

  Rx并不旨在替換現有的異步編程模型,如.NET事件,異步模式或任務并行庫。 但是,當您嘗試編寫事件時,Rx的工廠方法將為您提供在當前編程模型中找不到的方便。 這對于資源維護(例如,何時取消訂閱)和過濾(例如,選擇要接收什么類型的數據)尤其如此。 在本主題和后面的主題中,您可以了解這些Rx功能如何幫助您進行異步編程。

將.NET事件轉換為Rx可觀察序列

以下示例為鼠標移動事件創建一個簡單的.NET事件處理程序,并在Windows窗體的標簽中打印鼠標的位置。

using System.Linq;using System.Windows.Forms;using System.Reactive;using System.Reactive.Linq;using System;using WinForm;using System.Reactive.Disposables;class Program {  static void Main()   {     var lbl = new Label();      var frm = new Form { Controls = { lbl } };      frm.MouseMove += (sender, args) =>     {       lbl.Text = args.Location.ToString();     };     Application.Run(frm);  }; }

  要將事件導入Rx,您可以使用FromEventPattern運算符,并提供將由要橋接的事件引發的EventArgs對象。 FromEventPattern運算符用于接收對象發送方和一些EventArgs的事件,并使用反射為您找到這些添加/刪除方法。 然后,它將給定事件轉換為具有EventPattern類型的可觀察序列,該類型捕獲發送方和事件參數。

  對于具有一個參數(非標準事件)的代理,可以使用FromEvent操作符,該操作符需要一對用于附加和分離處理程序的函數。

  在下面的示例中,我們將Windows窗體的鼠標移動事件流轉換為可觀察序列。 每次觸發鼠標移動事件時,訂閱者將收到OnNext通知。 然后,我們可以檢查此類通知的EventArgs值,并獲取鼠標移動的位置。

using System.Linq;using System.Windows.Forms;using System.Reactive;using System.Reactive.Linq;using System;using WinForm;using System.Reactive.Disposables;class Program {  static void Main()   {     var lbl = new Label();      var frm = new Form { Controls = { lbl } };      IObservable<EventPattern<MouseEventArgs>> move = Observable.FromEventPattern<MouseEventArgs>(frm, "MouseMove");     move.Subscribe(evt => {                lbl.Text = evt.EventArgs.Location.ToString();             }) ;     Application.Run(frm);  }; }

  注意,在這個示例中,move變成了一個可觀察的序列,我們可以進一步操作。 使用LINQ運算符的查詢可觀察序列主題將向您展示如何將此序列投影到點類型的集合中并過濾其內容,以便應用程序只接收滿足特定條件的值。

  事件處理程序的清理由Subscribe方法返回的IDisposable對象負責。 調用Dispose(通過在此示例中到達use-block的末尾來完成)將釋放包括底層事件處理程序的序列正在使用的所有資源。 這本質上是代表您取消訂閱活動。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 星座| 沧州市| 弥勒县| 荆门市| 扬中市| 开江县| 衢州市| 武陟县| 交口县| 绥化市| 江口县| 沂水县| 凉山| 延安市| 和田县| 宁波市| 沧源| 崇文区| 若尔盖县| 保山市| 南阳市| 固始县| 宜丰县| 顺义区| 南和县| 沙坪坝区| 罗源县| 游戏| 申扎县| 东阿县| 开封市| 乌苏市| 临猗县| 宁远县| 册亨县| 获嘉县| 通山县| 泗洪县| 广饶县| 澄江县| 汉沽区|