System.Threading.Monitor.Wait メソッド

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

Wait(Object, Int32, Boolean) メソッド

このメソッドは、パラメーターの排他ロック obj を再取得するまで戻りません。

指定されたオブジェクトのロックを現在所有しているスレッドは、別のスレッドがオブジェクトにアクセスできるように、オブジェクトを解放するためにこのメソッドを呼び出します。 呼び出し元は、ロックの再取得を待機している間にブロックされます。 このメソッドは、別のスレッドの操作の結果として発生する状態変更を呼び出し元が待機する必要がある場合に呼び出されます。

タイムアウトにより、別のスレッドが最初に or PulseAll メソッドを呼び出さずにロックを解放した場合に、現在のスレッドが無期限にPulseブロックされないようにします。 また、スレッドを準備完了キューに移動し、待機キューの前にある他のスレッドをバイパスして、ロックをより早く再取得できるようにします。 スレッドは、メソッドの戻り値を Wait テストして、タイムアウト前にロックを再取得したかどうかを判断できます。スレッドは、待機に入る原因となった条件を評価し、必要に応じてメソッドを Wait 再度呼び出すことができます。

スレッドが呼び出 Waitすと、ロックが解放され、待機キューに入ります。 この時点で、準備完了キュー内の次のスレッド (存在する場合) がロックの制御を受け入れられます。 ロックを保持するスレッドが呼び出Waitされるか、またはキュー内の次のスレッドであり、ロックを保持しているスレッドが呼び出PulseAllされるまで、待機中のキューで再メインを呼び出Pulseしたスレッド。 ただし、別のスレッドがこのオブジェクトPulseまたはPulseAllメソッドを呼び出す前に経過するとmillisecondsTimeout、ロックを回復するために元のスレッドが準備完了キューに移動されます。

Note

パラメーターにmillisecondsTimeout指定した場合Infinite、ロック呼び出しPulseの所有者または PulseAll. 0 の場合 millisecondsTimeout 、呼び出す Wait スレッドはロックを解放し、すぐに準備完了キューに入ってロックを回復します。

指定したオブジェクトに対して呼び出された回数Enterに関係なく、呼び出し元は 1 回実行Waitされます。 概念的には、メソッドは Wait 、呼び出し元がオブジェクトで呼び出された Enter 回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ呼び出 Exit します。 呼び出し元は、オブジェクトの再取得を待機している間にブロックします。 呼び出し元がロックを再取得すると、システムは呼び出し元の保存されたEnter数を復元するために必要な回数を呼び出Enterします。 呼び出し Wait 元は、指定されたオブジェクトのロックのみを解放します。呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。

Note

同期されたオブジェクトには、現在ロックを保持しているスレッドへの参照、ロックを取得する準備ができているスレッドを含む準備完了キューへの参照、オブジェクトの状態の変更の通知を待機しているスレッドを含む待機キューへの参照など、いくつかの参照が保持されます。

PulseAll、およびWaitメソッドはPulse、同期されたコード ブロック内から呼び出す必要があります。

このメソッドの解説では、スレッドが Pulse 待機していないときに呼び出された場合 Pulse の動作について説明します。

Wait(Object, TimeSpan, Boolean) メソッド

このメソッドは、パラメーターの排他ロック obj を再取得するまで戻りません。

指定されたオブジェクトのロックを現在所有しているスレッドは、別のスレッドがオブジェクトにアクセスできるように、オブジェクトを解放するためにこのメソッドを呼び出します。 呼び出し元は、ロックの再取得を待機している間にブロックされます。 このメソッドは、別のスレッドの操作の結果として発生する状態変更を呼び出し元が待機する必要がある場合に呼び出されます。

タイムアウトにより、別のスレッドが最初に or PulseAll メソッドを呼び出さずにロックを解放した場合に、現在のスレッドが無期限にPulseブロックされないようにします。 また、スレッドを準備完了キューに移動し、待機キューの前にある他のスレッドをバイパスして、ロックをより早く再取得できるようにします。 スレッドは、メソッドの戻り値を Wait テストして、タイムアウト前にロックを再取得したかどうかを判断できます。スレッドは、待機に入る原因となった条件を評価し、必要に応じてメソッドを Wait 再度呼び出すことができます。

スレッドが呼び出 Waitすと、ロックが解放され、待機キューに入ります。 この時点で、準備完了キュー内の次のスレッド (存在する場合) がロックの制御を受け入れられます。 ロックを保持するスレッドが呼び出Waitされるか、またはキュー内の次のスレッドであり、ロックを保持しているスレッドが呼び出PulseAllされるまで、待機中のキューで再メインを呼び出Pulseしたスレッド。 ただし、 timeout 別のスレッドがこのオブジェクト Pulse または PulseAll メソッドを呼び出す前にミリ秒が経過すると、ロックを回復するために元のスレッドが準備完了キューに移動されます。

Note

パラメーターに TimeSpan -1 ミリ秒を表す値を指定したtimeout場合、ロック呼び出しPulsePulseAllまたは . 0 ミリ秒の場合 timeout 、呼び出す Wait スレッドはロックを解放し、すぐに準備完了キューに入ってロックを回復します。

指定したオブジェクトに対して呼び出された回数Enterに関係なく、呼び出し元は 1 回実行Waitされます。 概念的には、メソッドは Wait 、呼び出し元がオブジェクトで呼び出された Enter 回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ呼び出 Exit します。 呼び出し元は、オブジェクトの再取得を待機している間にブロックします。 呼び出し元がロックを再取得すると、システムは呼び出し元の保存されたEnter数を復元するために必要な回数を呼び出Enterします。 呼び出し Wait 元は、指定されたオブジェクトのロックのみを解放します。呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。

Note

同期されたオブジェクトには、現在ロックを保持しているスレッドへの参照、ロックを取得する準備ができているスレッドを含む準備完了キューへの参照、オブジェクトの状態の変更の通知を待機しているスレッドを含む待機キューへの参照など、いくつかの参照が保持されます。

PulseAll、およびWaitメソッドはPulse、同期されたコード ブロック内から呼び出す必要があります。

このメソッドの解説では、スレッドが Pulse 待機していないときに呼び出された場合 Pulse の動作について説明します。

コンテキストを終了する

既定以外のexitContext マネージド コンテキスト内からメソッドが Wait 呼び出されない限り、パラメーターは無効です。 これは、スレッドが派生 ContextBoundObjectクラスのインスタンスの呼び出し内にある場合に発生する可能性があります。 たとえば、派生ContextBoundObjectしていないクラスで現在メソッドを実行している場合でも、String現在のアプリケーションのスタック上にある場合ContextBoundObjectは、既定以外のコンテキストに入ることができますメイン。

コードが既定以外のコンテキストで実行されている場合、指定すると、trueexitContextメソッドを実行する前に、既定以外のマネージド コンテキスト (つまり、既定のコンテキストに遷移する) がスレッドによってWait終了します。 メソッドの呼び出しが完了すると、元の既定以外のコンテキストに Wait 戻ります。

これは、コンテキスト バインド クラスに属性が適用されている場合に SynchronizationAttribute 便利です。 その場合、クラスのメンバーに対するすべての呼び出しが自動的に同期され、同期はメインクラスのコード全体です。 メンバーの呼び出し履歴内のコードがメソッドをWait呼び出して指定trueexitContextすると、スレッドは同期を終了しメインオブジェクトの任意のメンバーへの呼び出しでブロックされたスレッドを続行できるようにします。 メソッドから制御がWait戻るときに、呼び出しを行ったスレッドは同期の再入力を待機する必要がありますメイン。