[ VB.NET / C# ] 名前付きイベントによるプロセス間通信 ( EventWaitHandle )

Pocket

ここでは、名前付きイベントを使用したプロセス間通信のサンプルコード( VB.NET / C# )を掲載しています。

スポンサーリンク

イベント待機プロセスのサンプル

以下は、イベント待機用プロセスのサンプルプログラムとなります。

VB.NET

    ' 待機用の名前付きイベントを作成
    Using ewh As EventWaitHandle = New EventWaitHandle(False, EventResetMode.AutoReset, "test_event_pokemon_go")

        Dim ret As Boolean = False

        Do
            ' タイムアウト(1000ms ret == false)の場合は再度イベントを待つ
            ret = ewh.WaitOne(1000, False)
            If (ret = False) Then
                Console.WriteLine("タイムアウトしました")
            End If
        Loop While (ret = False)

        Console.WriteLine("イベントを受信しました")

    End Using

C#

    // 待機用の名前付きイベントを作成
    using (EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset, "test_event_pokemon_go"))
    {
        bool ret = false;

        do
        {
            // タイムアウト(1000ms ret == false)の場合は再度イベントを待つ
            ret = ewh.WaitOne(1000, false);
            if(!ret)
            {
                Console.WriteLine("タイムアウトしました");
            }

        } while (!ret);

        Console.WriteLine("イベントを受信しました");
    }

イベント発生プロセスのサンプル

次はイベント発生させるプロセスのサンプルコードとなります。プロセス間通信の確認を行う場合は、イベント待機用プロセスとは別のプロセスとして作成します。

なお、サンプル内のコメントにもありますが、イベント待機中のプロセスを先に起動してイベント待機状態となってから、イベント発生させる必要があります。待機中のプロセスが存在しないと、System.Threading.WaitHandleCannotBeOpenedException 例外(指定された名前のハンドルは存在しません。)が発生してしまいます。

VB.NET

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

        ' イベント通知
        ewh.Set()

    End Using

C#

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

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

    }

複数の名前付イベントを同時に待ち合わせる

ここでは、1つの名前付きイベントの待ち合わせを行いましたが、複数の名前付イベントを同時に待ち合わせることもできます。サンプルは以下のリンクより確認できます。

参考
スポンサーリンク


Pocket

Leave a Comment

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