Domanda

Sospetto che questa sia una domanda molto stupida: qual è la sintassi corretta per un'istruzione di blocco interrompibile in C #? Per esempio. ottenere il blocco; se il blocco viene interrotto prima che finisca il codice bloccato, restituire false dal metodo allegato. Probabilmente la terminologia totalmente sbagliata ... Grazie.

È stato utile?

Soluzione

Puoi avere un timeout mentre acquisisci un lucchetto usando Monitor. TryEnter ; e allo stesso modo, all'interno di un blocco puoi fare cose come Monitor.Wait / Monitor.Pulse per rendere temporaneamente il blocco, ma non puoi essere interrotto come tale.

L'interruzione temporale principale applicabile potrebbe essere in Thread.Sleep, che può essere interrotta con Thread.Interrupt - ma ancora una volta, questo non strapperà il controllo da un blocco del metodo di esecuzione.

Che cosa stai esattamente cercando di ottenere? Con più contesto possiamo probabilmente aiutare di più ...

Altri suggerimenti

Che cosa intendi per "interrotto" non è chiaro.

Interruzione per eccezione

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;
}

Se il restituisce vero non viene raggiunto, allora è successo qualcosa mentre il blocco su foo è stato trattenuto e il codice restituisce false . Il blocco viene automaticamente rilasciato, in entrambi i casi.

Un altro thread può interrompere questo chiamando < code> Thread.Interrupt .

" Interruzione " dal codice

Se sei quello che "interrompe" il codice, potrebbe essere semplice come

private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    lock(foo)
    {
       // Do stuff

       if(shouldInterrupt)
       {
          return false;
       }

       // Do more stuff
    }

    return true;
 }

Ancora una volta, il blocco viene automaticamente rilasciato, indipendentemente dal fatto che vi sia o meno un'interruzione.

Interruzione perché qualcun altro sta cercando di acquisire il blocco

Forse questo è quello che stai cercando; in questo caso potresti voler usare qualcos'altro, come un < codice> Semaphore o ManualResetEvent .

Non sono sicuro di cosa stai cercando di arrivare qui. Lo scopo dell'istruzione lock è che non dovresti essere interrotto in modo da poter garantire un comportamento coerente.

Cosa stai cercando di realizzare qui?

Potresti anche dare un'occhiata all'ambito della transazione, aggiunto in 2.0, che potrebbe essere quello che stai cercando (sconosciuto, a causa dell'ambiguità nella tua domanda). Ti consente di provare alcune azioni, quindi di tornare indietro se tali azioni non sono state completate correttamente.

Vedi qui per maggiori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top