Lock Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Proporciona un mecanismo para lograr la exclusión mutua en regiones de código entre diferentes subprocesos.
public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
- Herencia
-
Lock
Comentarios
La Lock clase se puede usar para definir regiones de código que requieren acceso mutuamente excluyente entre subprocesos de un proceso, denominados secciones críticas, para evitar accesos simultáneos a un recurso. Se Lock puede introducir y salir, donde la región de código entre la entrada y la salida es una sección crítica asociada al bloqueo. Se dice que un subproceso que entra en un bloqueo contiene o posee el bloqueo hasta que sale del bloqueo. Como máximo, un subproceso puede contener un bloqueo en un momento dado. Un subproceso puede contener varios bloqueos. Un subproceso puede entrar en un bloqueo varias veces antes de salir de él, como recursivamente. Un subproceso que no puede entrar en un bloqueo inmediatamente puede esperar hasta que se pueda introducir el bloqueo o hasta que expire un tiempo de espera especificado.
Al usar los Enter métodos o TryEnter para escribir un bloqueo:
- Asegúrese de que el subproceso sale del bloqueo incluso Exit en caso de excepciones, como en C# mediante un
try/finallybloque . - Cuando se introduce y sale el bloqueo en un método de C#
async, asegúrese de que no haya entreawaitentrar y salir. Los bloqueos se mantienen en subprocesos y el código siguienteawaitpodría ejecutarse en otro subproceso.
Se recomienda usar el EnterScope método con una construcción de lenguaje que elimine automáticamente el devuelto Lock.Scope , como la palabra clave de C# using , o para usar la palabra clave de C# lock , ya que garantizan que el bloqueo se salga en casos excepcionales. Estos patrones también pueden tener ventajas de rendimiento sobre el uso Enter/TryEnter de y Exit. En el fragmento de código siguiente se muestran varios patrones para entrar y salir de un bloqueo.
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
Al usar la palabra clave de C# lock o similar a entrar y salir de un bloqueo, el tipo de la expresión debe ser precisamente System.Threading.Lock. Si el tipo de la expresión es cualquier otra cosa, como Object o un tipo genérico como T, se puede usar una implementación diferente que no sea intercambiable en su lugar (como Monitor). Para obtener más información, consulte el speclet del compilador pertinente.
Interrupt puede interrumpir los subprocesos que están esperando entrar en un bloqueo. En Windows subprocesos STA, espera a que los bloqueos permitan el bombeo de mensajes que pueden ejecutar otro código en el mismo subproceso durante una espera. Algunas características de las esperas se pueden invalidar mediante un personalizado SynchronizationContext.
Note
Un subproceso que entra en un bloqueo, incluidas varias veces, como de forma recursiva, debe salir del bloqueo el mismo número de veces para salir completamente del bloqueo y permitir que otros subprocesos entren en el bloqueo. Si un subproceso se cierra mientras mantiene un Lock, el comportamiento de Lock se convierte en indefinido.
Caution
Si, en una ruta de acceso de código, un subproceso puede escribir varios bloqueos antes de salir de ellos, asegúrese de que todas las rutas de acceso de código que puedan escribir cualquiera de esos bloqueos en el mismo subproceso los escriban en el mismo orden. De lo contrario, podría provocar interbloqueos. Por ejemplo, considere que, en un subproceso T1 de ruta de acceso de código, entra en bloqueo L1 y, después, se bloquea L2 antes de salir y en otro subproceso T2 de ruta de acceso de código entra en ambos bloqueos en el orden inverso. En ese escenario, sería posible que se produzca el siguiente orden de eventos: T1 escribe , escribe L1L2, T1T2 intenta entrar y esperas, T2 intenta entrar L2L1 y esperar. Hay un interbloqueo entre T1 y T2 que no se puede resolver, y cualquier otro subproceso que intente entrar en cualquiera de los bloqueos en el futuro también se bloqueará.
Constructores
| Nombre | Description |
|---|---|
| Lock() |
Inicializa una nueva instancia de la clase Lock. |
Propiedades
| Nombre | Description |
|---|---|
| IsHeldByCurrentThread |
Obtiene un valor que indica si el subproceso actual mantiene el bloqueo. |
Métodos
| Nombre | Description |
|---|---|
| Enter() |
Entra en el bloqueo, esperando si es necesario hasta que se pueda introducir el bloqueo. |
| EnterScope() |
Entra en el bloqueo, esperando si es necesario hasta que se pueda introducir el bloqueo. |
| Equals(Object) |
Determina si el objeto especificado es igual al objeto actual. (Heredado de Object) |
| Exit() |
Sale del bloqueo. |
| GetHashCode() |
Actúa como función hash predeterminada. (Heredado de Object) |
| GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
| MemberwiseClone() |
Crea una copia superficial del Objectactual. (Heredado de Object) |
| ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |
| TryEnter() |
Intenta entrar en el bloqueo sin esperar. |
| TryEnter(Int32) |
Intenta entrar en el bloqueo, esperando si es necesario para el número especificado de milisegundos hasta que se pueda introducir el bloqueo. |
| TryEnter(TimeSpan) |
Intenta entrar en el bloqueo, esperando si es necesario hasta que se pueda introducir el bloqueo o hasta que expire el tiempo de espera especificado. |