Sintaxis para el bloqueo interrumpible en C #
Pregunta
Sospecho que esta es una pregunta muy tonta: ¿cuál es la sintaxis correcta para una instrucción de bloqueo interrumpible en C #? P.ej. obtener bloqueo Si se interrumpe el bloqueo antes de que finalice el código bloqueado, devuelva false del método de cierre. Probablemente la terminología incorrecta ... Gracias.
Solución
Puede tener un tiempo de espera mientras está adquiriendo un bloqueo usando Monitor.TryEnter
; e igualmente, dentro de un bloqueo puede hacer cosas como Monitor.Wait
/ Monitor.Pulse
para generar el bloqueo temporalmente, pero no puede ser interrumpido como tal.
La interrupción de tiempo principal se aplica en Thread.Sleep, que puede interrumpirse con Thread.Interrupt, pero nuevamente, esto no eliminará el control de un bloque de método en ejecución.
¿Qué es exactamente lo que estás tratando de lograr? Con más contexto, probablemente podamos ayudar más ...
Otros consejos
Lo que quieres decir con " interrumpido " no está claro.
Interrupción por excepción
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
try
{
lock(foo)
{
while(something)
{
// Do stuff
Thread.Sleep(1); // Possibly yield to another
// thread calling Thread.Interrupt
}
}
return true;
}
catch(ThreadInterruptedException ex)
{
// Handle exception
}
return false;
}
Si no se alcanza el return true
, sucedió algo mientras se mantenía el bloqueo en foo
, y el código devuelve false
. El bloqueo se libera automáticamente, de cualquier manera.
Otro hilo puede interrumpir este llamando a < código> Thread.Interrupt .
" Interrupción " desde el código
Si eres el que " interrumpe " El código, podría ser tan simple como
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
lock(foo)
{
// Do stuff
if(shouldInterrupt)
{
return false;
}
// Do more stuff
}
return true;
}
Nuevamente, el bloqueo se libera automáticamente, haya o no una " interrupción " ;.
Interrupción porque alguien más está intentando adquirir el bloqueo
Posiblemente esto es lo que estás buscando; en este caso, es posible que desee utilizar otra cosa, como < código> Semaphore o ManualResetEvent
.
No estoy seguro de a qué estás tratando de llegar aquí. El propósito de la declaración lock
es que no debe interrumpirse para poder garantizar un comportamiento coherente.
¿Qué estás tratando de lograr aquí?
También puede echar un vistazo al alcance de la transacción, agregado en 2.0, que puede ser lo que está buscando (desconocido, debido a la ambigüedad de su pregunta). Le permite intentar algunas acciones, luego revertir si esas acciones no se completaron correctamente.
Consulte aquí para obtener más detalles.