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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top