[ C# ] 複数の名前付きイベントを待機するプロセス間通信サンプル ( EventWaitHandle.WaitAny )

Pocket

以下では、1つの名前付きイベントを EventWaitHandle.WaitOne メソッドを使用して待機するサンプルを掲載しました。

ここでは、複数の名前付きイベントを同時に待ち合わせるサンプルコードを掲載しています。

スポンサーリンク

複数の名前付きイベントの待ち合わせ

複数の名前付きイベントを同時に待ち合わせるサンプルプログラムになります。どれか1つのイベントが発生することで待機処理から復帰します。詳細はサンプル内のコメントを参照ください。

なお、設定したイベントのいずれかではなく、全てのイベントが発生した場合に処理復帰をさせたい時は、EventWaitHandle.WaitAll メソッドを使って実現することができます。

C#

    // 待機用の名前付きイベントを作成して配列に格納する
    EventWaitHandle[] ewhs= new EventWaitHandle[2];
    ewhs[0] = new EventWaitHandle(false, EventResetMode.AutoReset, "test_event_pokemon_go");
    ewhs[1] = new EventWaitHandle(false, EventResetMode.AutoReset, "test_event_pokemon_gogo");

    int ret = -1;  // リターン値

    do
    {
        // タイムアウト(1000ms ret == false)の場合は再度イベントを待つ
        // 配列に設定したいずれかのイベントが発生することで処理復帰する
        ret = EventWaitHandle.WaitAny(ewhs, 1000, false);
        // リターン値には発生イベントを格納した配列のインデックスが設定される

        // タイムアウトの場合:EventWaitHandle.WaitTimeout(258)
        if (ret == EventWaitHandle.WaitTimeout)
        {
            Console.WriteLine("タイムアウトしました");
        }
        else if(ret == 0)
        {
            Console.WriteLine("イベント:test_event_pokemon_goを受信");
        }
        else if (ret == 1)
        {
            Console.WriteLine("イベント:test_event_pokemon_gogoを受信");
        }

    // どちらかのイベントを受信したら待機をやめる
    } while (ret == EventWaitHandle.WaitTimeout);

    // using で記述していないので、リソースを開放する
    ewhs[0].Close();
    ewhs[1].Close();
 

イベントを発生させる ( EventWaitHandle.Set )

イベントの発生させるサンプルコードになります。前述のリンク先 『 [ VB.NET / C# ] 名前付きイベントによるプロセス間通信 ( EventWaitHandle ) 』 で掲載したサンプルコードと同じです。

C#

// このイベントを待機中のプロセスがいない場合は例外が発生する
using (EventWaitHandle ewh = EventWaitHandle.OpenExisting("test_event_pokemon_go")) {

    // イベント通知
    ewh.Set();
}
参考

VB.NET のソースコードの掲載は、体力の限界のため割愛することにしました。かわりに綺麗な清流の写真をお楽しみください。

奥飛騨郷平湯温泉周辺

奥飛騨郷平湯温泉周辺

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *