待機ハンドルは、あるスレッドのステータスを別のスレッドに通知するオブジェクトです。スレッドは、待機ハンドルを使用して、リソースの排他アクセスが必要であることを他のスレッドに通知できます。通知を受けたスレッドは、待機ハンドルが使用されなくなるまで、このリソースの使用を待つ必要があります。待機ハンドルの状態には、"シグナル状態" と "非シグナル状態" の 2 種類があります。どのスレッドにも所有されていない待機ハンドルは、"シグナル状態" です。スレッドによって所有されている待機ハンドルは、"非シグナル状態" です。
スレッドは、WaitOne、WaitAny、WaitAll などのいずれかの待機メソッドを呼び出して、待機ハンドルの所有権を要求します。待機メソッドは、個別のスレッドに対する Join メソッドと同様に、呼び出しをブロックするメソッドです。
待機ハンドルを所有しているスレッドがない場合、待機メソッドを呼び出すとすぐに True が戻ります。待機ハンドルの状態は非シグナル状態に変わり、待機ハンドルを所有するスレッドは実行を継続します。
スレッドが待機ハンドルの待機メソッドを呼び出すときに待機ハンドルが別のスレッドに所有されている場合、呼び出し元スレッドは一定時間待つか (タイムアウトを指定する場合)、待機ハンドルを所有しているスレッドが待機ハンドルを解放するまで待ちます (タイムアウトを指定しない場合)。タイムアウトを指定し、タイムアウトが経過する前に待機ハンドルが解放された場合、True が戻ります。それ以外の場合は、False が戻り、呼び出し元スレッドは実行を継続します。
待機ハンドルを所有するスレッドは、終了時または待機ハンドルが不要になったときに Set メソッドを呼び出します。他のスレッドは、Reset メソッドを呼び出すか、または WaitOne、WaitAny、または WaitAll を呼び出し、スレッドが Set を呼び出すのをきちんと待機することによって、待機ハンドルの状態を非シグナル状態にリセットできます。AutoResetEvent ハンドルは、単一の待機スレッドが解放された後で、システムによって自動的に非シグナル状態にリセットされます。待機中のスレッドがない場合、イベント オブジェクトはシグナル状態のままです。
Visual Basic で一般的に使用される待機ハンドルには、ミューテックス オブジェクト、ManualResetEvent、および AutoResetEvent の 3 種類があります。ManualResetEvent と AutoResetEvent は、同期イベントと呼ばれます。