내보내기(0) 인쇄
모두 확장

Monitor.Wait 메서드 (Object, TimeSpan)

업데이트: 2007년 11월

개체의 잠금을 해제한 다음 잠금을 다시 가져올 때까지 현재 스레드를 차단합니다. 지정된 시간 제한 간격이 지나면 스레드가 준비된 큐에 들어갑니다.

네임스페이스:  System.Threading
어셈블리:  mscorlib(mscorlib.dll)

public static bool Wait(
	Object obj,
	TimeSpan timeout
)
public static boolean Wait(
	Object obj,
	TimeSpan timeout
)
public static function Wait(
	obj : Object, 
	timeout : TimeSpan
) : boolean

매개 변수

obj
형식: System.Object

대기할 개체입니다.

timeout
형식: System.TimeSpan

스레드가 준비된 큐에 들어가기 전에 대기할 시간을 나타내는 TimeSpan입니다.

반환 값

형식: System.Boolean

지정된 시간이 경과하기 전에 잠금을 다시 가져오면 true이고, 지정된 시간이 경과한 이후에 잠금을 다시 가져오면 false입니다. 이 메서드는 잠금을 다시 가져올 때까지 반환하지 않습니다.

예외상황
ArgumentNullException

obj 매개 변수가 null인 경우

SynchronizationLockException

호출한 스레드가 지정된 개체 잠금을 소유하지 않는 경우

ThreadInterruptedException

Wait를 호출하는 스레드가 나중에 대기 상태에서 중단된 경우. 이는 다른 스레드에서 이 스레드의 Interrupt 메서드를 호출할 때 발생합니다.

ArgumentOutOfRangeException

timeout 매개 변수의 값(밀리초)이 음수이고 Infinite(-1밀리초)를 나타내지 않거나 MaxValue보다 큰 경우

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

현재 지정된 개체의 잠금을 소유하는 스레드는 다른 스레드에서 액세스할 수 있도록 해당 개체를 해제하기 위해 이 메서드를 호출합니다. 잠금을 다시 가져오기를 기다리는 동안 호출자가 차단됩니다. 이 메서드는 호출자가 다른 스레드 연산의 결과로 발생할 상태 변경을 기다려야 하는 경우 호출됩니다.

시간 제한이 있기 때문에 다른 스레드가 먼저 Pulse 또는 PulseAll 메서드를 호출하지 않고 잠금을 해제하는 경우 현재 스레드가 무기한 차단되지 않습니다. 또한 스레드를 준비된 큐로 이동하고 대기 큐에서 이 스레드 앞에 있는 다른 스레드를 무시하여 잠금을 더 빨리 다시 가져올 수 있습니다. 스레드는 Wait 메서드의 반환 값을 테스트하여 제한 시간 전에 잠금을 다시 가져왔는지 여부를 확인합니다. 스레드는 대기 상태로 들어가게 한 조건을 확인할 수 있으며 필요한 경우 Wait 메서드를 다시 호출합니다.

스레드에서 Wait를 호출하면 스레드는 개체 잠금을 해제하고 개체의 대기 중인 큐에 들어갑니다. 개체의 준비된 큐(있는 경우)에 있는 다음 스레드에서 잠금을 가져오고 개체를 단독으로 사용합니다. Wait를 호출한 스레드는 잠금을 보유한 스레드에서 PulseAll을 호출하거나, 큐에서 다음 순서이고 잠금을 보유한 스레드에서 Pulse를 호출할 때까지 대기 중인 큐에 남아 있습니다. 그러나 다른 스레드에서 이 개체의 Pulse 또는 PulseAll 메서드를 호출하기 전에 timeout이 경과하면 잠금을 다시 가져오기 위해 원래 스레드가 준비된 큐로 이동합니다.

참고:

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

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

참고:

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

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

Pulse 메서드에 대한 설명 부분에서는 대기 중인 스레드가 없을 때 Pulse를 호출한 경우에 발생하는 현상에 대해 설명합니다.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework 및 .NET Compact Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

.NET Framework

3.5, 3.0, 2.0, 1.1, 1.0에서 지원

커뮤니티 추가 항목

추가
표시:
© 2014 Microsoft