共用方式為


使用現有的 .NET 事件橋接

Rx 提供處理站方法,讓您能夠透過 .NET 中的現有非同步來源進行橋接,讓您可以在任何類型的資料流程上使用 Rx 所提供的豐富撰寫、篩選和資源管理功能。 本主題會檢查 FromEventPattern 運算子,允許將 .NET 事件「匯入」Rx 做為可觀察的序列。 每次引發事件時,OnNext 訊息都會傳遞至可觀察的序列。 然後,您可以操作事件資料,就像任何其他可觀察的序列一樣。

Rx 的目的不是取代現有的非同步程式設計模型,例如 .NET 事件、非同步模式或工作平行程式庫。 不過,當您嘗試撰寫事件時,Rx 的 Factory 方法會提供目前程式設計模型中找不到的便利性。 這特別適用于資源維護 (,例如何時取消訂閱) 和篩選 (例如,選擇要接收) 的資料種類。 在本主題和後續主題中,您可以檢查這些 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 運算子查詢可觀察序列主題將示範如何將此序列投影到 Points 類型的集合,並篩選其內容,讓應用程式只接收符合特定準則的值。

清除事件處理常式是由 Subscribe 方法所傳回的 IDisposable 物件負責。 呼叫 Dispose (完成,方法是到達此範例中的 using-block 結尾,) 將會釋放序列所使用的所有資源,包括基礎事件處理常式。 這基本上負責代表您取消訂閱事件。

另請參閱

概念

使用 LINQ 運算子查詢可觀察序列