C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でイベントをサブスクライブする方法を解説!1つのイベントに複数のサブスクライバーは登録できる?

イベント(Event)とは、クラスやオブジェクトにおいて、何らかの重要な出来事が発生したタイミングで、他のクラスやオブジェクトへ通知を送るための仕組みです。

イベントを発生させる側のクラスは「パブリッシャー(発行者)」と呼ばれ、イベントを受け取って処理を実行する側のクラスは「サブスクライバー(購読者)」と呼ばれます。

イベントの基本的な特徴

  • 1つのイベントには複数のサブスクライバーを登録できます。逆に、1つのサブスクライバーが複数のパブリッシャーから発行される複数のイベントを処理することも可能です。
  • サブスクライバーが1つも登録されていないイベントは、決して発生しません。
  • イベントが「いつ」発生するかはパブリッシャーが決定し、イベントに対して「どのような処理」を行うかはサブスクライバーが決定します。

C#でのイベントサブスクライブの実装例

以下のサンプルコードでは、動画エンコーダー(パブリッシャー)がエンコード完了時にイベントを発行し、メールサービスとメッセージサービス(サブスクライバー)がそれぞれそのイベントを受信して処理を行います。

class Program {
    static void Main() {
        var video = new MP4() { Title = "Eminem" };
        var videoEncoder = new MP4EncoderNew();
        var mailService = new MailService();
        var messageService = new MessageService();

        // 1つのイベントに複数のサブスクライバーを登録
        videoEncoder.mp4Encoded += mailService.onVideoEncoded;
        videoEncoder.mp4Encoded += messageService.onVideoEncoded;

        videoEncoder.Encode(video);
        Console.ReadKey();
    }
}

public class MP4 {
    public string Title { get; set; }
}

public class MP4Args : EventArgs {
    public MP4 mp4 { get; set; }
}

// パブリッシャー
public class MP4EncoderNew {
    public EventHandler mp4Encoded;

    public void Encode(MP4 video) {
        Console.WriteLine("Encoding MP4");
        Thread.Sleep(3000);
        OnVideoEncoded(video);
    }

    protected void OnVideoEncoded(MP4 video) {
        if (mp4Encoded != null) {
            mp4Encoded(this, new MP4Args() { mp4 = video });
        }
    }
}

// サブスクライバー1
public class MailService {
    public void onVideoEncoded(object source, MP4Args e) {
        Console.WriteLine("Mail Service:,Sending an email {0}", e.mp4.Title);
    }
}

// サブスクライバー2
public class MessageService {
    public void onVideoEncoded(object source, MP4Args e) {
        Console.WriteLine("Message Service:,Sending an Message {0}", e.mp4.Title);
    }
}

実行結果

Encoding MP4
Mail Service:,Sending an email Eminem
Message Service:,Sending an Message Eminem

このように、+= 演算子を使ってイベントハンドラーを追加することで、1つの mp4Encoded イベントに対して複数のサブスクライバー(MailService と MessageService)を登録でき、イベント発生時には登録されたすべてのハンドラーが順番に実行されます。

  1. PythonとMatplotlibで複数のプロットを1つの図に描画する方法

    Matplotlibは、データ可視化のために広く利用されている人気のPythonパッケージです。データの可視化は非常に重要なステップです。生の数値を目で追ったり複雑な計算を実行したりしなくても、データの中で何が起きているのかを直感的に把握できるようになるからです。また、定量的な洞察を聴衆に対して効果的に伝える手段としても役立ちます。Matplotlibは、データをもとに2次元のプロットを作成するために使われます。オブジェクト指向のAPIを備えており、Pythonアプリケーションへプロットを簡単に組み込むことができます。IPythonシェル、Jupyter Notebook、Spyderなどの開

  2. 複数のGmailアカウントをまとめて管理!1か所で全メールをチェックする6つの方法

    Gmailは、多くの人にとってオンライン上のあらゆる活動をつなぐ中心的な存在となっています。シングルサインオン(SSO)によるアクセス管理、重要な通知の受信、チーム会議アプリとの同期、職場ドメインとの連携まで、幅広い用途に対応する万能なメールサービスです。そのため、用途に応じて複数のGmailアカウントを使い分けている方も少なくありません。しかし、複数アカウントを利用するからといって、それぞれのパスワードを個別に覚えておく必要はありません。実は、1か所から複数のGmailアカウントへアクセスし、すべてのメールを同時に確認できる便利な方法がいくつもあるのです。本記事では、初心者でもすぐに試せる定