HOWTO · Csharp

C# でイベントを待機

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

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