C# でイベントを待機
このプログラミング記事では、C# でのイベントについて簡単に紹介し、次に C# でのイベントの待機について説明します。
C#
のイベント
イベントを使用すると、クラスやオブジェクトは、特定のことが起こったときに他のクラスやオブジェクトにアラートを出すことができます。 パブリッシャー クラスはイベントを送信し、イベントを受信または処理するクラスはサブスクライバーと呼ばれます。
ボタン クリック、マウス イベント (マウス移動、クリック、ダブルクリックなど)、キーボード イベントなど、いくつかのイベントはデフォルトで宣言されています。 ただし、イベントを宣言することもできます。
イベント ハンドラ
イベント ハンドラーは、イベントが発生したときに呼び出される関数です。 これらのハンドラーは、そのイベントが発生したときに自動的に呼び出され、アクションを実行します。
複数のイベント ハンドラーをイベントに接続することができ、イベントが発生すると、それらはすべて同期的に呼び出されます。 オブジェクトの状態の変化をクライアントに警告するイベントは、イベント ハンドラーによって処理することもできます。
したがって、イベントが発生したときにイベント ハンドラーが呼び出され、そのイベントが発生したときに必要な処理をイベント ハンドラー関数でコードに与えることができます。
C#
でイベントを待つ
イベントの発生時に関数を呼び出す必要がある場合、物事は非常に単純です。 たとえば、ボタンがクリックされたときに関数を呼び出す必要があります。
別のイベントが終了すると、関数を呼び出す必要があるときに事態が複雑になります。 これは、別のイベントがそのタスクを完了するまで、イベント ハンドラーを待機させる必要があることを意味します。
簡単な例でこれを示しましょう: 2つのボタンとテキスト フィールドです。 最初のボタンをクリックする必要があります。このボタンをクリックすると、テキスト フィールドにようこそテキスト
を入力する必要がありますが、2 番目のボタンもクリックするとそのテキストが表示されます。
最初に Windows フォーム アプリケーションでフォームを作成し、次の図のように 3つのコントロール、2つのボタン、およびテキスト フィールドを配置します。
button1
と button2
の両方がクリックされたときに、テキスト フィールドに入力する必要があります。 このタスクを達成するには、button2
がタスクを完了するまで button1
のハンドラーで待機し、テキスト フィールドの text
を設定する必要があります。
button1
のイベント ハンドラー関数はクラス TaskCompletionSource
を使用します。 このクラスは、button2
のハンドラーが終了するまで、button1
のハンドラーを待機させます。
コード:
TaskCompletionSource<bool> tcs = null;
private async void button1_Click(object sender, EventArgs e) {
tcs = new TaskCompletionSource<bool>();
label1.Text = "Click the Second Button";
await tcs.Task; // system will wait here
textBox1.Text = "You are done! ThankYou";
}
別のメソッドを待機するメソッドが必要な場合は、そのメソッドを async
として宣言し、そのメソッドを await
にします。 これは、2 番目のタスクが完了すると、この時点で返されます。
private void button2_Click(object sender, EventArgs e) {
tcs.TrySetResult(true);
}
2 番目のボタンについては、ボタンがクリックされると、上記のハンドラー関数が呼び出されます。 タスクの完了を true に設定し、他のタスクが完了したことを待機中のタスクに通知して、残りの機能を実行します。
出力:
最初のボタンがクリックされると、2 番目のボタンをクリックするメッセージも表示されます。 2 番目のボタンをクリックするとどうなるか見てみましょう。
2 番目のボタンをクリックすると、最初のボタンのハンドラ関数で設定したテキストがテキスト フィールドに表示されます。 これは、最初のボタンのハンドラー関数が 2 番目のボタンがクリックされるのを待ってから、残りの実装の実行を終了したことを意味します。
このようにして、イベントがタスクを完了するのを待つことができます。