다음을 통해 공유


System.Threading.Monitor.Wait 메서드

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

Wait(Object, Int32, Boolean) 메서드

이 메서드는 매개 변수에 obj 대한 배타적 잠금을 다시 가져올 때까지 반환되지 않습니다.

현재 지정된 개체의 잠금을 소유하고 있는 스레드는 다른 스레드가 액세스할 수 있도록 개체를 해제하기 위해 이 메서드를 호출합니다. 잠금을 다시 요청하는 동안 호출자가 차단됩니다. 이 메서드는 호출자가 다른 스레드의 작업으로 인해 발생하는 상태 변경을 기다려야 할 때 호출됩니다.

제한 시간은 다른 스레드가 먼저 또는 PulseAll 메서드를 호출하지 않고 잠금을 해제하는 경우 현재 스레드가 Pulse 무기한 차단되지 않도록 합니다. 또한 스레드를 준비 큐로 이동하여 대기 큐에서 앞서 다른 스레드를 우회하여 잠금을 더 빨리 다시 가져올 수 있습니다. 스레드는 메서드의 Wait 반환 값을 테스트하여 제한 시간 전에 잠금을 다시 입력했는지 여부를 확인할 수 있습니다. 스레드는 대기를 발생시킨 조건을 평가하고 필요한 경우 메서드를 다시 호출할 Wait 수 있습니다.

스레드가 호출 Wait되면 잠금을 해제하고 대기 큐에 들어갑니다. 이 시점에서 준비 큐의 다음 스레드(있는 경우)가 잠금을 제어할 수 있습니다. 잠금을 보유하는 스레드가 호출 Wait 되거나 큐의 다음 스레드이고 잠금이 호출되는 스레드가 호출PulseAll될 때까지 대기 중인 큐에서 다시 기본 Pulse스레드입니다. 그러나 다른 스레드가 이 개체 Pulse 또는 PulseAll 메서드를 호출하기 전에 경과하면 millisecondsTimeout 잠금을 다시 가져오기 위해 원래 스레드가 준비 큐로 이동됩니다.

참고 항목

매개 변수에 millisecondsTimeout 지정 된 경우 Infinite 이 메서드를 호출 Pulse 하거나 PulseAll잠금의 소유자를 하지 않는 한 무기한 차단 합니다. 0이면 millisecondsTimeout 호출 Wait 하는 스레드가 잠금을 해제한 다음 잠금을 다시 회복하기 위해 즉시 준비 큐에 들어갑니다.

호출자는 지정된 개체에 대해 호출된 횟 Enter 수에 관계없이 한 번 실행됩니다Wait. 개념적으로 메서드는 Wait 호출자가 개체에서 호출한 Enter 횟수를 저장하고 잠긴 개체를 완전히 해제하는 데 필요한 횟수를 호출 Exit 합니다. 그런 다음 호출자는 개체를 다시 가져올 때까지 기다리는 동안 차단합니다. 호출자가 잠금을 다시 가져올 때 시스템은 호출자에 대해 저장된 Enter 수를 복원하는 데 필요한 횟수를 호출 Enter 합니다. 호출하면 Wait 지정된 개체에 대한 잠금만 해제됩니다. 호출자가 다른 개체에 대한 잠금의 소유자인 경우 이러한 잠금은 해제되지 않습니다.

참고 항목

동기화된 개체에는 현재 잠금을 보유하고 있는 스레드에 대한 참조, 잠금을 가져올 준비가 된 스레드가 포함된 준비 큐에 대한 참조, 개체 상태 변경 알림을 기다리는 스레드가 포함된 대기 큐에 대한 참조 등 여러 참조가 있습니다.

코드의 Pulse동기화된 블록 내에서 메서드 PulseAllWait 호출해야 합니다.

메서드에 Pulse 대한 설명은 대기 중인 스레드가 없을 때 호출되면 어떻게 되는지 Pulse 설명합니다.

Wait(Object, TimeSpan, Boolean) 메서드

이 메서드는 매개 변수에 obj 대한 배타적 잠금을 다시 가져올 때까지 반환되지 않습니다.

현재 지정된 개체의 잠금을 소유하고 있는 스레드는 다른 스레드가 액세스할 수 있도록 개체를 해제하기 위해 이 메서드를 호출합니다. 잠금을 다시 요청하는 동안 호출자가 차단됩니다. 이 메서드는 호출자가 다른 스레드의 작업으로 인해 발생하는 상태 변경을 기다려야 할 때 호출됩니다.

제한 시간은 다른 스레드가 먼저 또는 PulseAll 메서드를 호출하지 않고 잠금을 해제하는 경우 현재 스레드가 Pulse 무기한 차단되지 않도록 합니다. 또한 스레드를 준비 큐로 이동하여 대기 큐에서 앞서 다른 스레드를 우회하여 잠금을 더 빨리 다시 가져올 수 있습니다. 스레드는 메서드의 Wait 반환 값을 테스트하여 제한 시간 전에 잠금을 다시 입력했는지 여부를 확인할 수 있습니다. 스레드는 대기를 발생시킨 조건을 평가하고 필요한 경우 메서드를 다시 호출할 Wait 수 있습니다.

스레드가 호출 Wait되면 잠금을 해제하고 대기 큐에 들어갑니다. 이 시점에서 준비 큐의 다음 스레드(있는 경우)가 잠금을 제어할 수 있습니다. 잠금을 보유하는 스레드가 호출 Wait 되거나 큐의 다음 스레드이고 잠금이 호출되는 스레드가 호출PulseAll될 때까지 대기 중인 큐에서 다시 기본 Pulse스레드입니다. 그러나 다른 스레드가 이 개체 Pulse 또는 PulseAll 메서드를 호출하기 전에 밀리초가 경과하면 timeout 잠금을 다시 가져오기 위해 원래 스레드가 준비 큐로 이동됩니다.

참고 항목

매개 변수에 TimeSpan 대해 나타내는 -1밀리초가 지정된 timeout 경우 잠금의 소유자가 호출 Pulse 하지 않는 한 이 메서드는 무기한 차단됩니다 PulseAll. 0밀리초인 경우 timeout 호출 Wait 하는 스레드는 잠금을 해제한 다음 잠금을 다시 회복하기 위해 즉시 준비 큐에 들어갑니다.

호출자는 지정된 개체에 대해 호출된 횟 Enter 수에 관계없이 한 번 실행됩니다Wait. 개념적으로 메서드는 Wait 호출자가 개체에서 호출한 Enter 횟수를 저장하고 잠긴 개체를 완전히 해제하는 데 필요한 횟수를 호출 Exit 합니다. 그런 다음 호출자는 개체를 다시 가져올 때까지 기다리는 동안 차단합니다. 호출자가 잠금을 다시 가져올 때 시스템은 호출자에 대해 저장된 Enter 수를 복원하는 데 필요한 횟수를 호출 Enter 합니다. 호출하면 Wait 지정된 개체에 대한 잠금만 해제됩니다. 호출자가 다른 개체에 대한 잠금의 소유자인 경우 이러한 잠금은 해제되지 않습니다.

참고 항목

동기화된 개체에는 현재 잠금을 보유하고 있는 스레드에 대한 참조, 잠금을 가져올 준비가 된 스레드가 포함된 준비 큐에 대한 참조, 개체 상태 변경 알림을 기다리는 스레드가 포함된 대기 큐에 대한 참조 등 여러 참조가 있습니다.

코드의 Pulse동기화된 블록 내에서 메서드 PulseAllWait 호출해야 합니다.

메서드에 Pulse 대한 설명은 대기 중인 스레드가 없을 때 호출되면 어떻게 되는지 Pulse 설명합니다.

컨텍스트 종료

메서드가exitContext 기본이 아닌 관리되는 컨텍스트 내에서 호출되지 않는 한 Wait 매개 변수는 효과가 없습니다. 이 문제는 스레드가 파생된 ContextBoundObject클래스의 인스턴스에 대한 호출 내에 있는 경우에 발생할 수 있습니다. 파생 되지 않은 클래스에 메서드를 현재 실행 중인 경우에 ContextBoundObject같은 String, 기본이 아닌 컨텍스트에서 할 경우를 ContextBoundObject 가 현재 애플리케이션 도메인에서 스택에 합니다.

코드가 기본이 아닌 컨텍스트에서 실행되는 경우 메서드를 trueexitContext 실행하기 전에 스레드가 기본 컨텍스트로 전환하기 위해 비디폴트 관리되는 컨텍스트를 종료하도록 지정합니다 Wait . 메서드 호출이 완료된 후 원래의 기본이 아닌 컨텍스트로 Wait 돌아갑니다.

컨텍스트 바인딩된 클래스에 특성이 SynchronizationAttribute 적용된 경우에 유용할 수 있습니다. 이 경우 클래스의 멤버에 대한 모든 호출이 자동으로 동기화되고 동기화가 수행됩니다기본 클래스의 전체 코드 본문입니다. 멤버의 호출 스택에 있는 코드가 메서드를 호출 Wait 하고 지정 trueexitContext하는 경우 스레드는 동기화를 종료합니다기본 개체의 멤버를 호출할 때 차단된 스레드가 계속 진행되도록 합니다. 메서드가 Wait 반환되면 호출한 스레드가 동기화를 다시 입력하기 위해 기다려야 합니다기본.