イベントをオブザーバブルに変換するには、Observable.FromEventを使う。
Observable.FromEvent Method (System.Reactive.Linq) | Microsoft Docs
Reactive Extensions入門 5「イベントを監視する」 - かずきのBlog@hatena
Reactive Extensions再入門 その6「HotなIObservableを作成するファクトリ」 - かずきのBlog@hatena
Rx入門 (11) - イベントのシーケンス化 - xin9le.net
カスタムイベント作って、
using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Observable_ { class Program { // カスタムイベント引数 public class CustomEventArgs : EventArgs { private string message; public string Message { get { return message; } private set { message = value; } } public CustomEventArgs(string message) { this.message = message; } } // カスタムイベントハンドラデリゲート public delegate void CustomEventHandler(object sender, CustomEventArgs e); // カスタムイベントソース public class CustomEventSource { public event CustomEventHandler CustomEvent; public void OnCustomEvent(string message) { if (CustomEvent != null) { CustomEvent(this, new CustomEventArgs(message)); } } } // カスタムイベントハンドラの実装 static void CustomEvent_OnCustomEvent(object sender, CustomEventArgs e) { Console.WriteLine("sender = " + sender.ToString()); Console.WriteLine("e.Message = " + e.Message); } // メインメソッド static void Main(string[] args) { // カスタムイベントソースの生成. var e = new CustomEventSource(); // カスタムイベントハンドラのセット. e.CustomEvent += CustomEvent_OnCustomEvent; // カスタムイベントを発生させる. e.OnCustomEvent("A"); Thread.Sleep(3000); // 3秒休止. e.OnCustomEvent("B"); Thread.Sleep(3000); // 3秒休止. e.OnCustomEvent("C"); // カスタムイベントハンドラの解除. e.CustomEvent -= CustomEvent_OnCustomEvent; } } }
こうすると、
sender = Observable_.Program+CustomEventSource e.Message = A sender = Observable_.Program+CustomEventSource e.Message = B sender = Observable_.Program+CustomEventSource e.Message = C 続行するには何かキーを押してください .
3秒ごとにCustomEvent_OnCustomEventに来てる。
これをオブザーバブルに変換するには、
第1引数が難しいが、イベントはsenderとeの2つの引数だが、オブザーバブルは引数がeだけなので、ちょっとそこをラムダ式で変換してる。
第2、第3引数は登録と削除。
Add Event. e.Message = A e.Message = B e.Message = C Remove Event. 続行するには何かキーを押してください . .
このe.MessageはSubscribeの第1引数の形式になっている。
3秒ごとにオブザーバブルで通知が来てる。
Sample/rx/Observable/FromEvent/src/Observable_ at master · bg1bgst333/Sample · GitHub