Syntaxe de verrouillage interruptible en C #
Question
Je suppose que c'est une question très stupide: quelle est la syntaxe correcte pour une instruction de verrouillage interruptible en C #? Par exemple. avoir le verrou; si le verrouillage est interrompu avant la fin du code verrouillé, renvoie false en dehors de la méthode englobante. Probablement totalement la mauvaise terminologie ... Merci.
La solution
Vous pouvez avoir un délai d’expiration tout en acquérant un verrou en utilisant Monitor.TryEnter
; De même, dans un verrou, vous pouvez effectuer des opérations telles que Monitor.Wait
/ Monitor.Pulse
pour annuler temporairement le verrouillage, mais vous ne pouvez pas être interrompu en tant que tel.
L'interruption principale de l'heure s'applique peut-être dans Thread.Sleep, qui peut être interrompu avec Thread.Interrupt - mais encore une fois, cela ne supprimera pas le contrôle d'un bloc de méthode en cours d'exécution.
Qu'est-ce que vous essayez exactement de réaliser? Avec plus de contexte, nous pouvons probablement aider davantage ...
Autres conseils
Ce que vous entendez par "interrompu" n'est pas clair.
Interruption par exception
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 le return true
n'est pas atteint, alors quelque chose s'est passé tant que le verrou sur foo
a été maintenu et que le code renvoie false
. Le verrou est automatiquement libéré, dans un cas ou
Un autre thread peut interrompre celui-ci en appelant < code> Thread.Interrupt .
"Interruption" à partir du code
Si vous êtes celui "interrompant" le code, il pourrait être aussi simple que
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
lock(foo)
{
// Do stuff
if(shouldInterrupt)
{
return false;
}
// Do more stuff
}
return true;
}
Encore une fois, le verrou est automatiquement relâché, qu'il y ait ou non une "interruption".
Interruption due à la tentative d'acquisition du verrou par une autre personne
C’est peut-être ce que vous recherchez; dans ce cas, vous voudrez peut-être utiliser autre chose, comme un < code> Semaphore ou ManualResetEvent
.
Je ne sais pas trop à quoi vous voulez en venir ici. L’objet de l’instruction lock
est que vous ne devez pas être interrompu pour assurer un comportement cohérent.
Qu'est-ce que vous essayez d'accomplir ici?
Vous pouvez également consulter l'étendue des transactions, ajoutée à la version 2.0, qui correspond peut-être à ce que vous recherchez (inconnu, en raison de l'ambiguïté de votre question). Il vous permet d’essayer certaines actions, puis de revenir en arrière si ces actions ne se sont pas terminées correctement.
Voir ici pour plus de détails.