Sintassi per blocco interrompibile in C #
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.
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.