Libera un bloqueo exclusivo en el objeto especificado.
Espacio de nombres: System.Threading
Ensamblado: mscorlib (en mscorlib.dll)

Sintaxis
Visual Basic (Declaración)
Public Shared Sub Exit ( _
obj As Object _
)
Dim obj As Object
Monitor.Exit(obj)
public static void Exit (
Object obj
)
public:
static void Exit (
Object^ obj
)
public static void Exit (
Object obj
)
public static function Exit (
obj : Object
)
Parámetros
- obj
Objeto en el que se va a liberar el bloqueo.

Excepciones

Comentarios
El subproceso que efectúa la llamada debe poseer el bloqueo en el parámetro obj. Si el subproceso que efectúa la llamada posee el bloqueo en el objeto especificado y ha realizado un número igual de llamadas a Exit y Enter para el objeto, entonces se libera el bloqueo. Si el subproceso que efectúa la llamada no ha invocado a Exit las mismas veces que a Enter, no se libera el bloqueo.
Si el bloqueo se libera y hay otros subprocesos listos en cola para el objeto, uno de los subprocesos adquiere el bloqueo. Si hay otros subprocesos en la cola de espera para adquirir el bloqueo, éstos no se desplazan automáticamente a la cola de subprocesos listos cuando el propietario del bloqueo llama a Exit. Para mover uno o varios subprocesos en espera a la cola de subprocesos listos, llame a Pulse o PulseAll antes de invocar a Exit.

Ejemplo
En el siguiente ejemplo se muestra la forma de utilizar el método Exit.
Imports System
Imports System.Threading
Imports System.Collections
Class MonitorSample
'Define the queue to safe thread access.
Private m_inputQueue As Queue
Public Sub New()
m_inputQueue = New Queue()
End Sub
'Add an element to the queue and obtain the monitor lock for the queue object.
Public Sub AddElement(ByVal qValue As Object)
'Lock the queue.
Monitor.Enter(m_inputQueue)
'Add an element.
m_inputQueue.Enqueue(qValue)
'Unlock the queue.
Monitor.Exit(m_inputQueue)
End Sub
'Try to add an element to the queue.
'Add the element to the queue only if the queue object is unlocked.
Public Function AddElementWithoutWait(ByVal qValue As Object) As Boolean
'Determine whether the queue is locked.
If Not Monitor.TryEnter(m_inputQueue) Then
Return False
Else
m_inputQueue.Enqueue(qValue)
Monitor.Exit(m_inputQueue)
Return True
End If
End Function
'Try to add an element to the queue.
'Add the element to the queue only if during the specified time the queue object will be unlocked.
Public Function WaitToAddElement(ByVal qValue As Object, ByVal waitTime As Integer) As Boolean
'Wait while the queue is locked.
If Not Monitor.TryEnter(m_inputQueue, waitTime) Then
Return False
Else
m_inputQueue.Enqueue(qValue)
Monitor.Exit(m_inputQueue)
Return True
End If
End Function
'Delete all elements that equal the given object and obtain the monitor lock for the queue object.
Public Sub DeleteElement(ByVal qValue As Object)
'Lock the queue.
Monitor.Enter(m_inputQueue)
Dim counter As Integer = m_inputQueue.Count
While (counter > 0)
'Check each element.
Dim elm As Object = m_inputQueue.Dequeue()
If Not elm.Equals(qValue) Then
m_inputQueue.Enqueue(elm)
End If
counter = counter - 1
End While
'Unlock the queue.
Monitor.Exit(m_inputQueue)
End Sub
'Print all queue elements.
Public Sub PrintAllElements()
'Lock the queue.
Monitor.Enter(m_inputQueue)
Dim elmEnum As IEnumerator = m_inputQueue.GetEnumerator()
While elmEnum.MoveNext()
'Print the next element.
Console.WriteLine(elmEnum.Current.ToString())
End While
'Unlock the queue.
Monitor.Exit(m_inputQueue)
End Sub
Public Shared Sub Main()
Dim sample As MonitorSample = New MonitorSample()
Dim i As Integer
For i = 0 To 29
sample.AddElement(i)
Next i
sample.PrintAllElements()
sample.DeleteElement(0)
sample.DeleteElement(10)
sample.DeleteElement(20)
sample.PrintAllElements()
End Sub
End Class
using System;
using System.Collections;
using System.Threading;
namespace MonitorCS2
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class MonitorSample
{
//Define the queue to safe thread access.
private Queue m_inputQueue;
public MonitorSample()
{
m_inputQueue = new Queue();
}
//Add an element to the queue and obtain the monitor lock for the queue object.
public void AddElement(object qValue)
{
//Lock the queue.
Monitor.Enter(m_inputQueue);
//Add element
m_inputQueue.Enqueue(qValue);
//Unlock the queue.
Monitor.Exit(m_inputQueue);
}
//Try to add an element to the queue.
//Add the element to the queue only if the queue object is unlocked.
public bool AddElementWithoutWait(object qValue)
{
//Determine whether the queue is locked
if(!Monitor.TryEnter(m_inputQueue))
return false;
m_inputQueue.Enqueue(qValue);
Monitor.Exit(m_inputQueue);
return true;
}
//Try to add an element to the queue.
//Add the element to the queue only if during the specified time the queue object will be unlocked.
public bool WaitToAddElement(object qValue, int waitTime)
{
//Wait while the queue is locked.
if(!Monitor.TryEnter(m_inputQueue,waitTime))
return false;
m_inputQueue.Enqueue(qValue);
Monitor.Exit(m_inputQueue);
return true;
}
//Delete all elements that equal the given object and obtain the monitor lock for the queue object.
public void DeleteElement(object qValue)
{
//Lock the queue.
Monitor.Enter(m_inputQueue);
int counter = m_inputQueue.Count;
while(counter > 0)
{
//Check each element.
object elm = m_inputQueue.Dequeue();
if(!elm.Equals(qValue))
{
m_inputQueue.Enqueue(elm);
}
--counter;
}
//Unlock the queue.
Monitor.Exit(m_inputQueue);
}
//Print all queue elements.
public void PrintAllElements()
{
//Lock the queue.
Monitor.Enter(m_inputQueue);
IEnumerator elmEnum = m_inputQueue.GetEnumerator();
while(elmEnum.MoveNext())
{
//Print the next element.
Console.WriteLine(elmEnum.Current.ToString());
}
//Unlock the queue.
Monitor.Exit(m_inputQueue);
}
static void Main(string[] args)
{
MonitorSample sample = new MonitorSample();
for(int i = 0; i < 30; i++)
sample.AddElement(i);
sample.PrintAllElements();
sample.DeleteElement(0);
sample.DeleteElement(10);
sample.DeleteElement(20);
sample.PrintAllElements();
}
}
}
using namespace System;
using namespace System::Collections;
using namespace System::Threading;
// Class definition
public ref class MonitorSample
{
public:
MonitorSample();
void AddElement( Object^ qValue );
bool AddElementWithoutWait( Object^ qValue );
bool WaitToAddElement( Object^ qValue, int waitTime );
void DeleteElement( Object^ qValue );
void PrintAllElements();
private:
Queue^ m_inputQueue;
};
//Define the queue to safe thread access.
MonitorSample::MonitorSample()
{
m_inputQueue = gcnew Queue;
}
//Add an element to the queue and obtain the monitor lock for the queue object.
void MonitorSample::AddElement( Object^ qValue )
{
//Lock the queue.
Monitor::Enter( m_inputQueue );
//Add element
m_inputQueue->Enqueue( qValue );
//Unlock the queue.
Monitor::Exit( m_inputQueue );
}
//Try to add an element to the queue.
//Add the element to the queue only if the queue object is unlocked.
bool MonitorSample::AddElementWithoutWait( Object^ qValue )
{
//Determine whether the queue is locked
if ( !Monitor::TryEnter( m_inputQueue ) )
return false;
m_inputQueue->Enqueue( qValue );
Monitor::Exit( m_inputQueue );
return true;
}
//Try to add an element to the queue.
//Add the element to the queue only if during the specified time the queue object will be unlocked.
bool MonitorSample::WaitToAddElement( Object^ qValue, int waitTime )
{
//Wait while the queue is locked.
if ( !Monitor::TryEnter( m_inputQueue, waitTime ) )
return false;
m_inputQueue->Enqueue( qValue );
Monitor::Exit( m_inputQueue );
return true;
}
//Delete all elements that equal the given object and obtain the monitor lock for the queue object.
void MonitorSample::DeleteElement( Object^ qValue )
{
//Lock the queue.
Monitor::Enter( m_inputQueue );
int counter = m_inputQueue->Count;
while ( counter > 0 )
{
//Check each element.
Object^ elm = m_inputQueue->Dequeue();
if ( !elm->Equals( qValue ) )
{
m_inputQueue->Enqueue( elm );
}
--counter;
}
Monitor::Exit( m_inputQueue );
}
//Print all queue elements.
void MonitorSample::PrintAllElements()
{
//Lock the queue.
Monitor::Enter( m_inputQueue );
IEnumerator^ elmEnum = m_inputQueue->GetEnumerator();
while ( elmEnum->MoveNext() )
{
//Print the next element.
Console::WriteLine( elmEnum->Current->ToString() );
}
Monitor::Exit( m_inputQueue );
}
int main()
{
MonitorSample^ sample = gcnew MonitorSample;
for ( int i = 0; i < 30; i++ )
sample->AddElement( i );
sample->PrintAllElements();
sample->DeleteElement( 0 );
sample->DeleteElement( 10 );
sample->DeleteElement( 20 );
sample->PrintAllElements();
}
package MonitorJSL2;
import System.*;
import System.Collections.*;
import System.Threading.*;
/// <summary>
/// Summary description for Class1.
/// </summary>
class MonitorSample
{
//Define the queue to safe thread access.
private Queue mInputQueue;
public MonitorSample()
{
mInputQueue = new Queue();
} //MonitorSample
// Add an element to the queue and obtain the monitor lock for the
// queue object.
public void AddElement(Object qValue)
{
//Lock the queue.
Monitor.Enter(mInputQueue);
//Add element
mInputQueue.Enqueue(qValue);
//Unlock the queue.
Monitor.Exit(mInputQueue);
} //AddElement
//Try to add an element to the queue.
//Add the element to the queue only if the queue object is unlocked.
public boolean AddElementWithoutWait(Object qValue)
{
//Determine whether the queue is locked
if (!(Monitor.TryEnter(mInputQueue))) {
return false;
}
mInputQueue.Enqueue(qValue);
Monitor.Exit(mInputQueue);
return true;
} //AddElementWithoutWait
//Try to add an element to the queue.
//Add the element to the queue only if during the specified time the
//queue object will be unlocked.
public boolean WaitToAddElement(Object qValue, int waitTime)
{
//Wait while the queue is locked.
if (!(Monitor.TryEnter(mInputQueue, waitTime))) {
return false;
}
mInputQueue.Enqueue(qValue);
Monitor.Exit(mInputQueue);
return true;
} //WaitToAddElement
//Delete all elements that equal the given object and obtain the
//monitor lock for the queue object.
public void DeleteElement(Object qValue)
{
//Lock the queue.
Monitor.Enter(mInputQueue);
int counter = mInputQueue.get_Count();
while (counter > 0) {
//Check each element.
Object elm = mInputQueue.Dequeue();
if (!(elm.Equals(qValue))) {
mInputQueue.Enqueue(elm);
}
--counter;
}
//Unlock the queue.
Monitor.Exit(mInputQueue);
} //DeleteElement
//Print all queue elements.
public void PrintAllElements()
{
//Lock the queue.
Monitor.Enter(mInputQueue);
IEnumerator elmEnum = mInputQueue.GetEnumerator();
while (elmEnum.MoveNext()) {
//Print the next element.
Console.WriteLine(elmEnum.get_Current().ToString());
}
//Unlock the queue.
Monitor.Exit(mInputQueue);
} //PrintAllElements
public static void main(String[] args)
{
MonitorSample sample = new MonitorSample();
for (int i = 0; i < 30; i++) {
sample.AddElement((Int32)i);
}
sample.PrintAllElements();
sample.DeleteElement((Int32)0);
sample.DeleteElement((Int32)10);
sample.DeleteElement((Int32)20);
sample.PrintAllElements();
} //main
} //MonitorSample

Plataformas
Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter
Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

Información de versión
.NET Framework
Compatible con: 3.0, 2.0, 1.1, 1.0
.NET Compact Framework
Compatible con: 2.0, 1.0
XNA Framework
Compatible con: 1.0

Vea también