Monitor.Wait メソッド

定義

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock.

オーバーロード

Wait(Object, Int32, Boolean)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue. このメソッドは、コンテキストの同期ドメイン (同期されたコンテキストの場合) が待機の前に終了し、後で再取得されるかどうかも指定します。This method also specifies whether the synchronization domain for the context (if in a synchronized context) is exited before the wait and reacquired afterward.

Wait(Object)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock.

Wait(Object, Int32)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue.

Wait(Object, TimeSpan)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue.

Wait(Object, TimeSpan, Boolean)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue. または、待機の前に同期化されたコンテキストの同期ドメインを終了し、ドメインを後で再取得します。Optionally exits the synchronization domain for the synchronized context before the wait and reacquires the domain afterward.

Wait(Object, Int32, Boolean)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue. このメソッドは、コンテキストの同期ドメイン (同期されたコンテキストの場合) が待機の前に終了し、後で再取得されるかどうかも指定します。This method also specifies whether the synchronization domain for the context (if in a synchronized context) is exited before the wait and reacquired afterward.

public:
 static bool Wait(System::Object ^ obj, int millisecondsTimeout, bool exitContext);
public static bool Wait (object obj, int millisecondsTimeout, bool exitContext);
static member Wait : obj * int * bool -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer, exitContext As Boolean) As Boolean

パラメーター

obj
Object

待機を行うオブジェクト。The object on which to wait.

millisecondsTimeout
Int32

スレッドが実行待ちキューに入るまでの待機時間 (ミリ秒)。The number of milliseconds to wait before the thread enters the ready queue.

exitContext
Boolean

待機の前にコンテキストの同期ドメイン (同期されたコンテキストの場合) を終了および再取得する場合はtrue 。それ以外の場合は falsetrue to exit and reacquire the synchronization domain for the context (if in a synchronized context) before the wait; otherwise, false.

戻り値

指定した時間が経過する前にロックが再取得された場合は true。指定した時間が経過した後にロックが再取得された場合は falsetrue if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. このメソッドは、ロックが再取得されるまで制御を戻しません。The method does not return until the lock is reacquired.

例外

obj パラメーターが null です。The obj parameter is null.

Wait は、同期されたコード ブロック内からは呼び出されません。Wait is not invoked from within a synchronized block of code.

Wait を呼び出したスレッドは、後で待機中の状態を中断されます。The thread that invokes Wait is later interrupted from the waiting state. これは、他のスレッドがこのスレッドの Interrupt() メソッドを呼び出すときに起こります。This happens when another thread calls this thread's Interrupt() method.

millisecondsTimeout パラメーターの値が負で、Infinite と等しくありません。The value of the millisecondsTimeout parameter is negative, and is not equal to Infinite.

注釈

このメソッドは、obj パラメーターに対して排他ロックを再取得するまで、を返しません。This method does not return until it reacquires an exclusive lock on the obj parameter.

現在、指定したオブジェクトのロックを所有しているスレッドは、別のスレッドがアクセスできるようにオブジェクトを解放するために、このメソッドを呼び出します。The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. ロックの再取得を待機している間に、呼び出し元がブロックされました。The caller is blocked while waiting to reacquire the lock. このメソッドは、別のスレッドの操作の結果として発生する状態の変化を呼び出し元が待機する必要があるときに呼び出されます。This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

タイムアウトにより、Pulse または PulseAll メソッドを最初に呼び出さずに、別のスレッドがロックを解放した場合に、現在のスレッドが無期限にブロックされないようにすることができます。The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. また、スレッドを準備完了キューに移動し、待機キュー内で他のスレッドをバイパスして、ロックをすぐに再取得できるようにします。It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. スレッドは、Wait メソッドの戻り値をテストして、タイムアウト前にロックを再取得するかどうかを判断できます。スレッドは、待機に入る原因となった条件を評価し、必要に応じて Wait メソッドを再度呼び出します。The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

スレッドが Waitを呼び出すと、ロックが解放され、待機キューに入ります。When a thread calls Wait, it releases the lock and enters the waiting queue. この時点で、準備完了キュー内の次のスレッド (存在する場合) は、ロックの制御を許可されます。At this point, the next thread in the ready queue (if there is one) is allowed to take control of the lock. ロックを保持するスレッドが PulseAllを呼び出すか、またはキュー内の次のスレッドが呼び出され、ロックを保持しているスレッドが Pulseを呼び出すまで、Wait を呼び出したスレッドは待機キューに残ります。The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. ただし、別のスレッドがこのオブジェクトの Pulse または PulseAll メソッドを呼び出す前に millisecondsTimeout が経過すると、ロックを取り戻すために元のスレッドが準備完了キューに移動されます。However, if millisecondsTimeout elapses before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

注意

millisecondsTimeout パラメーターに Infinite が指定されている場合、ロックの所有者が Pulse または PulseAllを呼び出す場合を除き、このメソッドは無期限にブロックされます。If Infinite is specified for the millisecondsTimeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. millisecondsTimeout が0の場合、Wait を呼び出すスレッドはロックを解放し、ロックを取り戻すためにすぐに準備完了キューに入ります。If millisecondsTimeout equals 0, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

呼び出し元は、指定されたオブジェクトに対して Enter が呼び出された回数に関係なく、一度 Wait を実行します。The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. 概念的には、Wait メソッドは、呼び出し元がオブジェクトに対して Enter 呼び出した回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ Exit を呼び出します。Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. その後、オブジェクトの再取得を待機している間、呼び出し元はブロックします。The caller then blocks while waiting to reacquire the object. 呼び出し元がロックを再取得すると、システムは、呼び出し元に対して保存された Enter カウントを復元するために必要な回数だけ Enter を呼び出します。When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. を呼び出すと、指定したオブジェクトのロックのみが解放されます。 Wait は、呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

注意

同期されたオブジェクトは、現在ロックを保持しているスレッドへの参照、準備されたキューへの参照、ロックを取得する準備ができているスレッドを含む、待機キューへの参照など、いくつかの参照を保持します。これには、オブジェクトの状態の変更の通知を待機しているスレッド。A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

PulsePulseAll、および Wait メソッドは、同期されたコードブロック内から呼び出す必要があります。The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Pulse メソッドの解説では、スレッドが待機していないときに Pulse が呼び出された場合の処理について説明します。The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

コンテキストの終了に関する注意事項Notes on Exiting the Context

exitContext パラメーターは、Wait メソッドが既定以外のマネージコンテキストの内部から呼び出されない限り、効果はありません。TheexitContext parameter has no effect unless the Wait method is called from inside a nondefault managed context. これは、スレッドが ContextBoundObjectから派生したクラスのインスタンスの呼び出し内にある場合に発生する可能性があります。This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Stringなど、ContextBoundObjectから派生していないクラスでメソッドを現在実行している場合でも、現在のアプリケーションドメインのスタックに ContextBoundObject がある場合は、既定以外のコンテキストにすることができます。Even if you are currently executing a method on a class that is not derived from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

コードが既定以外のコンテキストで実行されている場合、exitContexttrue を指定すると、スレッドは Wait メソッドを実行する前に、既定以外のマネージコンテキスト (つまり、既定のコンテキストに遷移する) を終了します。When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the Wait method. Wait メソッドの呼び出しが完了した後、元の既定以外のコンテキストに戻ります。It returns to the original nondefault context after the call to the Wait method completes.

これは、コンテキストバインドクラスに SynchronizationAttribute 属性が適用されている場合に便利です。This can be useful when the context-bound class has the SynchronizationAttribute attribute applied. その場合、クラスのメンバーへのすべての呼び出しが自動的に同期され、同期ドメインがクラスのコード本文全体になります。In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. メンバーの呼び出し履歴内のコードが Wait メソッドを呼び出し、exitContexttrue を指定した場合、スレッドは同期ドメインを終了します。これにより、オブジェクトの任意のメンバーへの呼び出しでブロックされているスレッドが続行されます。If code in the call stack of a member calls the Wait method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Wait メソッドから制御が戻ったとき、呼び出しを行ったスレッドは、同期ドメインの再入力を待機する必要があります。When the Wait method returns, the thread that made the call must wait to reenter the synchronization domain.

こちらもご覧ください

Wait(Object)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock.

public:
 static bool Wait(System::Object ^ obj);
public static bool Wait (object obj);
static member Wait : obj -> bool
Public Shared Function Wait (obj As Object) As Boolean

パラメーター

obj
Object

待機を行うオブジェクト。The object on which to wait.

戻り値

呼び出し元が、指定したオブジェクトのロックを再取得したために呼び出しが返された場合は truetrue if the call returned because the caller reacquired the lock for the specified object. このメソッドは、ロックが再取得されないと制御を戻しません。This method does not return if the lock is not reacquired.

例外

obj パラメーターが null です。The obj parameter is null.

呼び出し元のスレッドは、指定したオブジェクトのロックを所有していません。The calling thread does not own the lock for the specified object.

Wait を呼び出したスレッドは、後で待機中の状態を中断されます。The thread that invokes Wait is later interrupted from the waiting state. これは、他のスレッドがこのスレッドの Interrupt() メソッドを呼び出すときに起こります。This happens when another thread calls this thread's Interrupt() method.

注釈

現在、指定したオブジェクトのロックを所有しているスレッドは、別のスレッドがアクセスできるようにオブジェクトを解放するために、このメソッドを呼び出します。The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. ロックの再取得を待機している間に、呼び出し元がブロックされました。The caller is blocked while waiting to reacquire the lock. このメソッドは、別のスレッドの操作の結果として発生する状態の変化を呼び出し元が待機する必要があるときに呼び出されます。This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

スレッドが Waitを呼び出すと、オブジェクトのロックが解放され、オブジェクトの待機キューに入ります。When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. オブジェクトの準備完了キュー内の次のスレッド (存在する場合) は、ロックを取得し、オブジェクトを排他的に使用します。The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. Wait を呼び出すすべてのスレッドは、ロックの所有者によって送信された Pulse または PulseAllからのシグナルを受信するまで待機キューに保持されます。All threads that call Wait remain in the waiting queue until they receive a signal from Pulse or PulseAll, sent by the owner of the lock. Pulse が送信されると、待機キューの先頭にあるスレッドだけが影響を受けます。If Pulse is sent, only the thread at the head of the waiting queue is affected. PulseAll が送信されると、そのオブジェクトを待機しているすべてのスレッドが影響を受けます。If PulseAll is sent, all threads that are waiting for the object are affected. シグナルを受信すると、1つまたは複数のスレッドが待機キューを離れ、準備完了キューに入ります。When the signal is received, one or more threads leave the waiting queue and enter the ready queue. 準備完了キュー内のスレッドは、ロックを再取得することが許可されています。A thread in the ready queue is permitted to reacquire the lock.

このメソッドは、呼び出し元のスレッドがオブジェクトのロックを再取得たときにを返します。This method returns when the calling thread reacquires the lock on the object. ロックの所有者が Pulse または PulseAllを呼び出さない場合、このメソッドは無期限にブロックされることに注意してください。Note that this method blocks indefinitely if the holder of the lock does not call Pulse or PulseAll.

呼び出し元は、指定されたオブジェクトに対して Enter が呼び出された回数に関係なく、一度 Wait を実行します。The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. 概念的には、Wait メソッドは、呼び出し元がオブジェクトに対して Enter 呼び出した回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ Exit を呼び出します。Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. その後、オブジェクトの再取得を待機している間、呼び出し元はブロックします。The caller then blocks while waiting to reacquire the object. 呼び出し元がロックを再取得すると、システムは、呼び出し元に対して保存された Enter カウントを復元するために必要な回数だけ Enter を呼び出します。When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. を呼び出すと、指定したオブジェクトのロックのみが解放されます。 Wait は、呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

同期されたオブジェクトには、現在ロックを保持しているスレッドへの参照、準備完了キューへの参照、ロックを取得する準備ができているスレッドを含む、待機キューへの参照など、いくつかの参照が保持されていることに注意してください。オブジェクトの状態が変更されたことを示す通知を待機しているスレッドを格納します。Note that a synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

PulsePulseAll、および Wait メソッドは、同期されたコードブロック内から呼び出す必要があります。The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Pulse メソッドの解説では、スレッドが待機していないときに Pulse が呼び出された場合の処理について説明します。The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

こちらもご覧ください

Wait(Object, Int32)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue.

public:
 static bool Wait(System::Object ^ obj, int millisecondsTimeout);
public static bool Wait (object obj, int millisecondsTimeout);
static member Wait : obj * int -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer) As Boolean

パラメーター

obj
Object

待機を行うオブジェクト。The object on which to wait.

millisecondsTimeout
Int32

スレッドが実行待ちキューに入るまでの待機時間 (ミリ秒)。The number of milliseconds to wait before the thread enters the ready queue.

戻り値

指定した時間が経過する前にロックが再取得された場合は true。指定した時間が経過した後にロックが再取得された場合は falsetrue if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. このメソッドは、ロックが再取得されるまで制御を戻しません。The method does not return until the lock is reacquired.

例外

obj パラメーターが null です。The obj parameter is null.

呼び出し元のスレッドは、指定したオブジェクトのロックを所有していません。The calling thread does not own the lock for the specified object.

Wait を呼び出したスレッドは、後で待機中の状態を中断されます。The thread that invokes Wait is later interrupted from the waiting state. これは、他のスレッドがこのスレッドの Interrupt() メソッドを呼び出すときに起こります。This happens when another thread calls this thread's Interrupt() method.

millisecondsTimeout パラメーターの値が負で、Infinite と等しくありません。The value of the millisecondsTimeout parameter is negative, and is not equal to Infinite.

注釈

このメソッドは、obj パラメーターに対して排他ロックを再取得するまで、を返しません。This method does not return until it reacquires an exclusive lock on the obj parameter.

現在、指定したオブジェクトのロックを所有しているスレッドは、別のスレッドがアクセスできるようにオブジェクトを解放するために、このメソッドを呼び出します。The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. ロックの再取得を待機している間に、呼び出し元がブロックされました。The caller is blocked while waiting to reacquire the lock. このメソッドは、別のスレッドの操作の結果として発生する状態の変化を呼び出し元が待機する必要があるときに呼び出されます。This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

タイムアウトにより、Pulse または PulseAll メソッドを最初に呼び出さずに、別のスレッドがロックを解放した場合に、現在のスレッドが無期限にブロックされないようにすることができます。The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. また、スレッドを準備完了キューに移動し、待機キュー内で他のスレッドをバイパスして、ロックをすぐに再取得できるようにします。It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. スレッドは、Wait メソッドの戻り値をテストして、タイムアウト前にロックを再取得するかどうかを判断できます。スレッドは、待機に入る原因となった条件を評価し、必要に応じて Wait メソッドを再度呼び出します。The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

スレッドが Waitを呼び出すと、オブジェクトのロックが解放され、オブジェクトの待機キューに入ります。When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. オブジェクトの準備完了キュー内の次のスレッド (存在する場合) は、ロックを取得し、オブジェクトを排他的に使用します。The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. ロックを保持するスレッドが PulseAllを呼び出すか、またはキュー内の次のスレッドが呼び出され、ロックを保持しているスレッドが Pulseを呼び出すまで、Wait を呼び出したスレッドは待機キューに残ります。The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. ただし、別のスレッドがこのオブジェクトの Pulse または PulseAll メソッドを呼び出す前に millisecondsTimeout が経過すると、ロックを取り戻すために元のスレッドが準備完了キューに移動されます。However, if millisecondsTimeout elapses before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

注意

millisecondsTimeout パラメーターに Infinite が指定されている場合、ロックの所有者が Pulse または PulseAllを呼び出す場合を除き、このメソッドは無期限にブロックされます。If Infinite is specified for the millisecondsTimeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. millisecondsTimeout が0の場合、Wait を呼び出すスレッドはロックを解放し、ロックを取り戻すためにすぐに準備完了キューに入ります。If millisecondsTimeout equals 0, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

呼び出し元は、指定されたオブジェクトに対して Enter が呼び出された回数に関係なく、一度 Wait を実行します。The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. 概念的には、Wait メソッドは、呼び出し元がオブジェクトに対して Enter 呼び出した回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ Exit を呼び出します。Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. その後、オブジェクトの再取得を待機している間、呼び出し元はブロックします。The caller then blocks while waiting to reacquire the object. 呼び出し元がロックを再取得すると、システムは、呼び出し元に対して保存された Enter カウントを復元するために必要な回数だけ Enter を呼び出します。When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. を呼び出すと、指定したオブジェクトのロックのみが解放されます。 Wait は、呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

注意

同期されたオブジェクトは、現在ロックを保持しているスレッドへの参照、準備されたキューへの参照、ロックを取得する準備ができているスレッドを含む、待機キューへの参照など、いくつかの参照を保持します。これには、オブジェクトの状態の変更の通知を待機しているスレッド。A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

PulsePulseAll、および Wait メソッドは、同期されたコードブロック内から呼び出す必要があります。The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Pulse メソッドの解説では、スレッドが待機していないときに Pulse が呼び出された場合の処理について説明します。The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

こちらもご覧ください

Wait(Object, TimeSpan)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue.

public:
 static bool Wait(System::Object ^ obj, TimeSpan timeout);
public static bool Wait (object obj, TimeSpan timeout);
static member Wait : obj * TimeSpan -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan) As Boolean

パラメーター

obj
Object

待機を行うオブジェクト。The object on which to wait.

timeout
TimeSpan

スレッドが実行待ちキューに入るまでの時間を表す TimeSpanA TimeSpan representing the amount of time to wait before the thread enters the ready queue.

戻り値

指定した時間が経過する前にロックが再取得された場合は true。指定した時間が経過した後にロックが再取得された場合は falsetrue if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. このメソッドは、ロックが再取得されるまで制御を戻しません。The method does not return until the lock is reacquired.

例外

obj パラメーターが null です。The obj parameter is null.

呼び出し元のスレッドは、指定したオブジェクトのロックを所有していません。The calling thread does not own the lock for the specified object.

Wait を呼び出したスレッドは、後で待機中の状態を中断されます。The thread that invokes Wait is later interrupted from the waiting state. これは、他のスレッドがこのスレッドの Interrupt() メソッドを呼び出すときに起こります。This happens when another thread calls this thread's Interrupt() method.

timeout パラメーターのミリ秒単位の値が負で、かつ Infinite (-1 ミリ秒) ではありません。または MaxValue より大きい値です。The value of the timeout parameter in milliseconds is negative and does not represent Infinite (-1 millisecond), or is greater than MaxValue.

注釈

このメソッドは、obj パラメーターに対して排他ロックを再取得するまで、を返しません。This method does not return until it reacquires an exclusive lock on the obj parameter.

現在、指定したオブジェクトのロックを所有しているスレッドは、別のスレッドがアクセスできるようにオブジェクトを解放するために、このメソッドを呼び出します。The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. ロックの再取得を待機している間に、呼び出し元がブロックされました。The caller is blocked while waiting to reacquire the lock. このメソッドは、別のスレッドの操作の結果として発生する状態の変化を呼び出し元が待機する必要があるときに呼び出されます。This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

タイムアウトにより、Pulse または PulseAll メソッドを最初に呼び出さずに、別のスレッドがロックを解放した場合に、現在のスレッドが無期限にブロックされないようにすることができます。The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. また、スレッドを準備完了キューに移動し、待機キュー内で他のスレッドをバイパスして、ロックをすぐに再取得できるようにします。It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. スレッドは、Wait メソッドの戻り値をテストして、タイムアウト前にロックを再取得するかどうかを判断できます。スレッドは、待機に入る原因となった条件を評価し、必要に応じて Wait メソッドを再度呼び出します。The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

スレッドが Waitを呼び出すと、オブジェクトのロックが解放され、オブジェクトの待機キューに入ります。When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. オブジェクトの準備完了キュー内の次のスレッド (存在する場合) は、ロックを取得し、オブジェクトを排他的に使用します。The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. ロックを保持するスレッドが PulseAllを呼び出すか、またはキュー内の次のスレッドが呼び出され、ロックを保持しているスレッドが Pulseを呼び出すまで、Wait を呼び出したスレッドは待機キューに残ります。The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. ただし、別のスレッドがこのオブジェクトの Pulse または PulseAll メソッドを呼び出す前に timeout が経過すると、ロックを取り戻すために元のスレッドが準備完了キューに移動されます。However, if timeout elapses before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

注意

timeout パラメーターに-1 ミリ秒を表す TimeSpan が指定されている場合、ロックの所有者が Pulse または PulseAllを呼び出す場合を除き、このメソッドは無期限にブロックします。If a TimeSpan representing -1 millisecond is specified for the timeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. timeout が0ミリ秒の場合、Wait を呼び出すスレッドはロックを解放し、ロックを取り戻すためにすぐに準備完了キューに入ります。If timeout is 0 milliseconds, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

呼び出し元は、指定されたオブジェクトに対して Enter が呼び出された回数に関係なく、一度 Wait を実行します。The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. 概念的には、Wait メソッドは、呼び出し元がオブジェクトに対して Enter 呼び出した回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ Exit を呼び出します。Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. その後、オブジェクトの再取得を待機している間、呼び出し元はブロックします。The caller then blocks while waiting to reacquire the object. 呼び出し元がロックを再取得すると、システムは、呼び出し元に対して保存された Enter カウントを復元するために必要な回数だけ Enter を呼び出します。When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. を呼び出すと、指定したオブジェクトのロックのみが解放されます。 Wait は、呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

注意

同期されたオブジェクトは、現在ロックを保持しているスレッドへの参照、準備されたキューへの参照、ロックを取得する準備ができているスレッドを含む、待機キューへの参照など、いくつかの参照を保持します。これには、オブジェクトの状態の変更の通知を待機しているスレッド。A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

PulsePulseAll、および Wait メソッドは、同期されたコードブロック内から呼び出す必要があります。The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Pulse メソッドの解説では、スレッドが待機していないときに Pulse が呼び出された場合の処理について説明します。The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

こちらもご覧ください

Wait(Object, TimeSpan, Boolean)

オブジェクトのロックを解放し、現在のスレッドがロックを再取得するまでそのスレッドをブロックします。Releases the lock on an object and blocks the current thread until it reacquires the lock. 指定されたタイムアウト期限を過ぎると、スレッドは実行待ちキューに入ります。If the specified time-out interval elapses, the thread enters the ready queue. または、待機の前に同期化されたコンテキストの同期ドメインを終了し、ドメインを後で再取得します。Optionally exits the synchronization domain for the synchronized context before the wait and reacquires the domain afterward.

public:
 static bool Wait(System::Object ^ obj, TimeSpan timeout, bool exitContext);
public static bool Wait (object obj, TimeSpan timeout, bool exitContext);
static member Wait : obj * TimeSpan * bool -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan, exitContext As Boolean) As Boolean

パラメーター

obj
Object

待機を行うオブジェクト。The object on which to wait.

timeout
TimeSpan

スレッドが実行待ちキューに入るまでの時間を表す TimeSpanA TimeSpan representing the amount of time to wait before the thread enters the ready queue.

exitContext
Boolean

待機の前にコンテキストの同期ドメイン (同期されたコンテキストの場合) を終了および再取得する場合はtrue 。それ以外の場合は falsetrue to exit and reacquire the synchronization domain for the context (if in a synchronized context) before the wait; otherwise, false.

戻り値

指定した時間が経過する前にロックが再取得された場合は true。指定した時間が経過した後にロックが再取得された場合は falsetrue if the lock was reacquired before the specified time elapsed; false if the lock was reacquired after the specified time elapsed. このメソッドは、ロックが再取得されるまで制御を戻しません。The method does not return until the lock is reacquired.

例外

obj パラメーターが null です。The obj parameter is null.

Wait は、同期されたコード ブロック内からは呼び出されません。Wait is not invoked from within a synchronized block of code.

Wait を呼び出すスレッドは、後で待機状態の途中で中断されます。The thread that invokes Wait is later interrupted from the waiting state. これは、他のスレッドがこのスレッドの Interrupt() メソッドを呼び出すときに起こります。This happens when another thread calls this thread's Interrupt() method.

timeout パラメーターが負で Infinite (-1 ミリ秒) を表していないか、MaxValue よりも大きいです。The timeout parameter is negative and does not represent Infinite (-1 millisecond), or is greater than MaxValue.

注釈

このメソッドは、obj パラメーターに対して排他ロックを再取得するまで、を返しません。This method does not return until it reacquires an exclusive lock on the obj parameter.

現在、指定したオブジェクトのロックを所有しているスレッドは、別のスレッドがアクセスできるようにオブジェクトを解放するために、このメソッドを呼び出します。The thread that currently owns the lock on the specified object invokes this method in order to release the object so that another thread can access it. ロックの再取得を待機している間に、呼び出し元がブロックされました。The caller is blocked while waiting to reacquire the lock. このメソッドは、別のスレッドの操作の結果として発生する状態の変化を呼び出し元が待機する必要があるときに呼び出されます。This method is called when the caller needs to wait for a state change that will occur as a result of another thread's operations.

タイムアウトにより、Pulse または PulseAll メソッドを最初に呼び出さずに、別のスレッドがロックを解放した場合に、現在のスレッドが無期限にブロックされないようにすることができます。The time-out ensures that the current thread does not block indefinitely if another thread releases the lock without first calling the Pulse or PulseAll method. また、スレッドを準備完了キューに移動し、待機キュー内で他のスレッドをバイパスして、ロックをすぐに再取得できるようにします。It also moves the thread to the ready queue, bypassing other threads ahead of it in the wait queue, so that it can reacquire the lock sooner. スレッドは、Wait メソッドの戻り値をテストして、タイムアウト前にロックを再取得するかどうかを判断できます。スレッドは、待機に入る原因となった条件を評価し、必要に応じて Wait メソッドを再度呼び出します。The thread can test the return value of the Wait method to determine whether it reacquired the lock prior to the time-out. The thread can evaluate the conditions that caused it to enter the wait, and if necessary call the Wait method again.

スレッドが Waitを呼び出すと、ロックが解放され、待機キューに入ります。When a thread calls Wait, it releases the lock and enters the waiting queue. この時点で、準備完了キュー内の次のスレッド (存在する場合) は、ロックの制御を許可されます。At this point, the next thread in the ready queue (if there is one) is allowed to take control of the lock. ロックを保持するスレッドが PulseAllを呼び出すか、またはキュー内の次のスレッドが呼び出され、ロックを保持しているスレッドが Pulseを呼び出すまで、Wait を呼び出したスレッドは待機キューに残ります。The thread that invoked Wait remains in the waiting queue until either a thread that holds the lock invokes PulseAll, or it is the next in the queue and a thread that holds the lock invokes Pulse. ただし、別のスレッドがこのオブジェクトの Pulse または PulseAll メソッドを呼び出す前に timeout ミリ秒が経過した場合、ロックを取り戻すために元のスレッドは準備完了キューに移動されます。However, if timeout milliseconds elapse before another thread invokes this object's Pulse or PulseAll method, the original thread is moved to the ready queue in order to regain the lock.

注意

timeout パラメーターに-1 ミリ秒を表す TimeSpan が指定されている場合、ロックの所有者が Pulse または PulseAllを呼び出す場合を除き、このメソッドは無期限にブロックします。If a TimeSpan representing -1 millisecond is specified for the timeout parameter, this method blocks indefinitely unless the holder of the lock calls Pulse or PulseAll. timeout が0ミリ秒の場合、Wait を呼び出すスレッドはロックを解放し、ロックを取り戻すためにすぐに準備完了キューに入ります。If timeout is 0 milliseconds, the thread that calls Wait releases the lock and then immediately enters the ready queue in order to regain the lock.

呼び出し元は、指定されたオブジェクトに対して Enter が呼び出された回数に関係なく、一度 Wait を実行します。The caller executes Wait once, regardless of the number of times Enter has been invoked for the specified object. 概念的には、Wait メソッドは、呼び出し元がオブジェクトに対して Enter 呼び出した回数を格納し、ロックされたオブジェクトを完全に解放するために必要な回数だけ Exit を呼び出します。Conceptually, the Wait method stores the number of times the caller invoked Enter on the object and invokes Exit as many times as necessary to fully release the locked object. その後、オブジェクトの再取得を待機している間、呼び出し元はブロックします。The caller then blocks while waiting to reacquire the object. 呼び出し元がロックを再取得すると、システムは、呼び出し元に対して保存された Enter カウントを復元するために必要な回数だけ Enter を呼び出します。When the caller reacquires the lock, the system calls Enter as many times as necessary to restore the saved Enter count for the caller. を呼び出すと、指定したオブジェクトのロックのみが解放されます。 Wait は、呼び出し元が他のオブジェクトのロックの所有者である場合、これらのロックは解放されません。Calling Wait releases the lock for the specified object only; if the caller is the owner of locks on other objects, these locks are not released.

注意

同期されたオブジェクトは、現在ロックを保持しているスレッドへの参照、準備されたキューへの参照、ロックを取得する準備ができているスレッドを含む、待機キューへの参照など、いくつかの参照を保持します。これには、オブジェクトの状態の変更の通知を待機しているスレッド。A synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

PulsePulseAll、および Wait メソッドは、同期されたコードブロック内から呼び出す必要があります。The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Pulse メソッドの解説では、スレッドが待機していないときに Pulse が呼び出された場合の処理について説明します。The remarks for the Pulse method explain what happens if Pulse is called when no threads are waiting.

コンテキストの終了に関する注意事項Notes on Exiting the Context

exitContext パラメーターは、Wait メソッドが既定以外のマネージコンテキストの内部から呼び出されない限り、効果はありません。TheexitContext parameter has no effect unless the Wait method is called from inside a nondefault managed context. これは、スレッドが ContextBoundObjectから派生したクラスのインスタンスの呼び出し内にある場合に発生する可能性があります。This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Stringなど、ContextBoundObjectから派生していないクラスでメソッドを現在実行している場合でも、現在のアプリケーションドメインのスタックに ContextBoundObject がある場合は、既定以外のコンテキストにすることができます。Even if you are currently executing a method on a class that is not derived from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

コードが既定以外のコンテキストで実行されている場合、exitContexttrue を指定すると、スレッドは Wait メソッドを実行する前に、既定以外のマネージコンテキスト (つまり、既定のコンテキストに遷移する) を終了します。When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the Wait method. Wait メソッドの呼び出しが完了した後、元の既定以外のコンテキストに戻ります。It returns to the original nondefault context after the call to the Wait method completes.

これは、コンテキストバインドクラスに SynchronizationAttribute 属性が適用されている場合に便利です。This can be useful when the context-bound class has the SynchronizationAttribute attribute applied. その場合、クラスのメンバーへのすべての呼び出しが自動的に同期され、同期ドメインがクラスのコード本文全体になります。In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. メンバーの呼び出し履歴内のコードが Wait メソッドを呼び出し、exitContexttrue を指定した場合、スレッドは同期ドメインを終了します。これにより、オブジェクトの任意のメンバーへの呼び出しでブロックされているスレッドが続行されます。If code in the call stack of a member calls the Wait method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Wait メソッドから制御が戻ったとき、呼び出しを行ったスレッドは、同期ドメインの再入力を待機する必要があります。When the Wait method returns, the thread that made the call must wait to reenter the synchronization domain.

こちらもご覧ください

適用対象