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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top