C# でイベントを待機

Naila Saad Siddiqui 2023年10月12日
  1. C# のイベント
  2. C# でイベントを待つ
C# でイベントを待機

このプログラミング記事では、C# でのイベントについて簡単に紹介し、次に C# でのイベントの待機について説明します。

C# のイベント

イベントを使用すると、クラスやオブジェクトは、特定のことが起こったときに他のクラスやオブジェクトにアラートを出すことができます。 パブリッシャー クラスはイベントを送信し、イベントを受信または処理するクラスはサブスクライバーと呼ばれます。

ボタン クリック、マウス イベント (マウス移動、クリック、ダブルクリックなど)、キーボード イベントなど、いくつかのイベントはデフォルトで宣言されています。 ただし、イベントを宣言することもできます。

イベント ハンドラ

イベント ハンドラーは、イベントが発生したときに呼び出される関数です。 これらのハンドラーは、そのイベントが発生したときに自動的に呼び出され、アクションを実行します。

複数のイベント ハンドラーをイベントに接続することができ、イベントが発生すると、それらはすべて同期的に呼び出されます。 オブジェクトの状態の変化をクライアントに警告するイベントは、イベント ハンドラーによって処理することもできます。

したがって、イベントが発生したときにイベント ハンドラーが呼び出され、そのイベントが発生したときに必要な処理をイベント ハンドラー関数でコードに与えることができます。

C# でイベントを待つ

イベントの発生時に関数を呼び出す必要がある場合、物事は非常に単純です。 たとえば、ボタンがクリックされたときに関数を呼び出す必要があります。

別のイベントが終了すると、関数を呼び出す必要があるときに事態が複雑になります。 これは、別のイベントがそのタスクを完了するまで、イベント ハンドラーを待機させる必要があることを意味します。

簡単な例でこれを示しましょう: 2つのボタンとテキスト フィールドです。 最初のボタンをクリックする必要があります。このボタンをクリックすると、テキスト フィールドにようこそテキストを入力する必要がありますが、2 番目のボタンもクリックするとそのテキストが表示されます。

最初に Windows フォーム アプリケーションでフォームを作成し、次の図のように 3つのコントロール、2つのボタン、およびテキスト フィールドを配置します。

ウィンドウフォームコントロールのサンプル

button1button2 の両方がクリックされたときに、テキスト フィールドに入力する必要があります。 このタスクを達成するには、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 番目のボタンをクリックすると、最初のボタンのハンドラ関数で設定したテキストがテキスト フィールドに表示されます。 これは、最初のボタンのハンドラー関数が 2 番目のボタンがクリックされるのを待ってから、残りの実装の実行を終了したことを意味します。

このようにして、イベントがタスクを完了するのを待つことができます。

関連記事 - Csharp Event