thread synlock lock español async c# multithreading locking

synlock - thread synchronization c#



¿Hay una operación "intentar bloquear, omitir si se ha agotado el tiempo" en C#? (5)

Ed tiene la función correcta para ti. No olvides llamar a Monitor.Exit() . Debe usar un bloque try-finally para garantizar una limpieza adecuada.

if (Monitor.TryEnter(someObject)) { try { // use object } finally { Monitor.Exit(someObject); } }

Necesito tratar de bloquear un objeto, y si ya está bloqueado simplemente continúe (después de tiempo fuera, o sin él).

La instrucción de bloqueo C # está bloqueando.


Probablemente descubrirá esto por sí mismo ahora que los otros lo han señalado en la dirección correcta, pero TryEnter también puede tomar un parámetro de tiempo de espera.

"CLR Via C #" de Jeff Richter es un excelente libro sobre detalles de las entrañas de CLR si te estás metiendo en cosas más complicadas.


Creo que puedes usar Monitor.TryEnter() .

La instrucción de bloqueo simplemente se traduce en una llamada Monitor.Enter() y un bloque try catch .


Tuve el mismo problema, terminé creando una clase TryLock que implementa IDisposable y luego usa la instrucción using para controlar el alcance del bloqueo:

public class TryLock : IDisposable { private object locked; public bool HasLock { get; private set; } public TryLock(object obj) { if (Monitor.TryEnter(obj)) { HasLock = true; locked = obj; } } public void Dispose() { if (HasLock) { Monitor.Exit(locked); locked = null; HasLock = false; } } }

Y luego use la siguiente sintaxis para bloquear:

var obj = new object(); using (var tryLock = new TryLock(obj)) { if (tryLock.HasLock) { Console.WriteLine("Lock acquired.."); } }