Esta documentación está archivada y no tiene mantenimiento.

Monitor (Clase)

Actualización: noviembre 2007

Proporciona un mecanismo que sincroniza el acceso a los objetos.

Espacio de nombres:  System.Threading
Ensamblado:  mscorlib (en mscorlib.dll)

[ComVisibleAttribute(true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public static class Monitor
/** @attribute ComVisibleAttribute(true) */
/** @attribute HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true) */
public final class Monitor
public final class Monitor

x090d6tf.alert_note(es-es,VS.90).gifNota:

El atributo HostProtectionAttribute aplicado a este tipo o miembro tiene el siguiente valor de la propiedad Resources: Synchronization | ExternalThreading. El atributo HostProtectionAttribute no afecta a las aplicaciones de escritorio (que normalmente se inician haciendo doble clic en un icono, escribiendo un comando o introduciendo una dirección URL en el explorador). Para obtener más información, vea la clase HostProtectionAttribute o Programación de SQL Server y atributos de protección del host.

La clase Monitor controla el acceso a los objetos, concediendo un bloqueo para un objeto a un único subproceso. Los bloqueos de objetos permiten restringir el acceso a un bloque de código, normalmente denominado sección crítica. Mientras que un subproceso posea el bloqueo de un objeto, ningún otro subproceso podrá adquirir ese bloqueo. Monitor puede utilizarse también para garantizar que no se permita a ningún otro subproceso el acceso a una sección del código de la aplicación que el propietario del bloqueo esté ejecutando, a menos que el otro subproceso esté ejecutando el código utilizando un objeto bloqueado distinto.

x090d6tf.alert_note(es-es,VS.90).gifNota:

Monitor se debe utilizar para bloquear objetos (es decir, tipos de referencia), no tipos de valor. Para obtener información, vea Enter y el tema conceptual Monitores.

La clase Monitor tiene las siguientes características:

  • Está asociada a un objeto a petición.

  • Es independiente, lo que significa que se puede llamar a esta clase directamente desde cualquier contexto.

  • No se puede crear una instancia de Monitor.

Para cada objeto sincronizado, se mantiene la siguiente información:

  • Una referencia al subproceso que contenga el bloqueo en la actualidad.

  • Una referencia a una cola de subprocesos listos, que contenga los subprocesos que ya están listos para obtener el bloqueo.

  • Una referencia a una cola en espera, que contenga los subprocesos que se encuentren a la espera de una notificación sobre un cambio de estado del objeto bloqueado.

En la siguiente tabla se describen las acciones que pueden realizar los subprocesos que obtienen acceso a los objetos sincronizados:

Acción

Descripción

Enter, TryEnter

Adquiere un bloqueo para un objeto. Esta acción marca el principio de una sección crítica. Ningún otro subproceso puede entrar en la sección crítica, a menos que esté ejecutando las instrucciones de la sección crítica utilizando un objeto bloqueado distinto.

Wait

Libera el bloqueo sobre un objeto para permitir a otros subprocesos bloquear y obtener acceso al objeto. El subproceso que realiza la llamada espera mientras otro subproceso obtiene acceso al objeto. Las señales de pulsos se utilizan para notificar los cambios de estado de un objeto a los subprocesos en espera.

Pulse (signal), PulseAll

Envía una señal a uno o varios subprocesos en espera. La señal notifica al subproceso en espera que el estado de un objeto bloqueado ha cambiado, y el propietario del bloqueo está en condiciones de liberarlo. El subproceso en espera se coloca en la cola de subprocesos listos del objeto, de modo que pueda recibir el bloqueo del objeto. Una vez que el subproceso dispone del bloqueo, puede comprobar el nuevo estado del objeto y así observar si se ha alcanzado el estado requerido.

Exit

Libera el bloqueo en un objeto. Esta acción también marca el final de una sección crítica protegida por el objeto bloqueado.

Utilice los métodos Enter y Exit para marcar el principio y el final de una sección crítica. Si la sección crítica está formada por un conjunto de instrucciones contiguas, el bloqueo adquirido por el método Enter garantiza que sea un único subproceso el que pueda ejecutar el código delimitado con el objeto bloqueado. En tal caso, se recomienda incluir dichas instrucciones en un bloque try y colocar la instrucción Exit en un bloque finally. Esta utilidad se utiliza normalmente para sincronizar el acceso a un método de instancia o a un método estático de una clase. Si un método de instancia requiere acceso a un subproceso sincronizado, invoca a Enter y a los métodos Exit correspondientes utilizando la instancia actual como objeto que se va a bloquear. Puesto que sólo un subproceso puede contener el bloqueo en la instancia actual, sólo podrá ejecutar el método un único subproceso cada vez. Los métodos estáticos están protegidos de forma similar, mediante el Type de la instancia actual como objeto bloqueado. La funcionalidad proporcionada por los métodos Enter y Exit es idéntica a la que proporciona la instrucción lock de C# (SyncLock en Visual Basic), excepto que lock y SyncLock contienen el método Exit en un bloque tryfinally (TryFinally en Visual Basic) para asegurar que se libera el monitor.

Si una sección crítica abarca todo un método, la utilidad de bloqueo descrita anteriormente puede conseguirse colocando System.Runtime.CompilerServices.MethodImplAttribute en el método y especificando el valor Synchronized en el constructor de MethodImplAttribute. Si se utiliza este atributo, no es necesario utilizar las instrucciones Enter y Exit. Tenga en cuenta que el atributo es el responsable de que el subproceso actual mantenga el bloqueo hasta que el método devuelve un valor; si el bloqueo puede liberarse antes, utilice la clase Monitor o la instrucción lock de C# en lugar del atributo.

Aunque las instrucciones Enter y Exit que bloquean y liberan un objeto determinado puedan atravesar los límites de clase y miembro, no se considera una práctica recomendable.

A la hora de seleccionar un objeto en el que se va a sincronizar, sólo debe bloquear los objetos internos o privados. El bloqueo sobre objetos externos puede dar lugar a interbloqueos, porque el código no relacionado puede bloquear los mismos objetos con otros propósitos.

System.Object
  System.Threading.Monitor

Este tipo es seguro para la ejecución de subprocesos.

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, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 3.5, 2.0, 1.0

XNA Framework

Compatible con: 2.0, 1.0
Mostrar: