Observable.FromEvent

イベントをオブザーバブルに変換するには、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