Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

Monitor.TryEnter méthode (Object, Int32, Boolean)

 

Tente, pendant le nombre spécifié de millisecondes, d'acquérir un verrou exclusif sur l'objet spécifié et définit de manière atomique une valeur qui indique si le verrou a été pris.

Espace de noms:   System.Threading
Assembly:  mscorlib (dans mscorlib.dll)

public static void TryEnter(
	object obj,
	int millisecondsTimeout,
	ref bool lockTaken
)

Paramètres

obj
Type: System.Object

Objet sur lequel acquérir le verrou.

millisecondsTimeout
Type: System.Int32

Délai d'attente du verrou en millisecondes.

lockTaken
Type: System.Boolean

Résultat de la tentative d'acquisition du verrou, passé par la référence. L'entrée doit avoir la valeur false. La sortie a la valeur true si un verrou est acquis ; sinon, elle a la valeur false. La sortie est définie même si une exception se produit lors de la tentative d'acquisition du verrou.

Exception Condition
ArgumentException

L’entrée de lockTaken est true.

ArgumentNullException

Le paramètre obj a la valeur null.

ArgumentOutOfRangeException

millisecondsTimeout est négatif et n’est pas égal à Infinite.

If the millisecondsTimeout parameter equals F:System.Threading.Timeout.Infinite, this method is equivalent to M:System.Threading.Monitor.Enter(System.Object). If millisecondsTimeout equals 0, this method is equivalent to M:System.Threading.Monitor.TryEnter(System.Object).

If the lock was not taken because an exception was thrown, the variable specified for the lockTaken parameter is false after this method ends. This allows the program to determine, in all cases, whether it is necessary to release the lock.

System_CAPS_noteRemarque

Use T:System.Threading.Monitor to lock objects (that is, reference types), not value types. For more information, see the T:System.Threading.Monitor class topic.

To ensure that the thread does not enter the critical section, you should examine the value of lockTaken and execute code in the critical section only if its value is true. The following code fragment shows the pattern used to call this method. Note that you should call M:System.Threading.Monitor.Exit(System.Object) in a finally block to ensure that the calling thread releases its lock on the critical section if an exception occurs.

var lockObj = new Object();
int timeout = 500;
bool lockTaken = false;

try {
   Monitor.TryEnter(lockObj, timeout, ref lockTaken);
   if (lockTaken) {
      // The critical section.
   }
   else {
      // The lock was not acquired.
   }
}
finally {
   // Ensure that the lock is released.
   if (lockTaken) {
      Monitor.Exit(lockObj);
   }   
}

The following code shows the basic pattern for using the M:System.Threading.Monitor.TryEnter(System.Object,System.Boolean@) method overload. This overload always sets the value of the variable that is passed to the ref parameter (ByRef in Visual Basic) lockTaken, even if the method throws an exception, so the value of the variable is a reliable way to test whether the lock has to be released.

bool acquiredLock = false;

try
{
    Monitor.TryEnter(lockObject, 500, ref acquiredLock);
    if (acquiredLock)
    {

        // Code that accesses resources that are protected by the lock.

    }
    else
    {

        // Code to deal with the fact that the lock was not acquired.

    }
}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}

Plateforme Windows universelle
Disponible depuis 8
.NET Framework
Disponible depuis 4.0
Bibliothèque de classes portable
Pris en charge dans : plateformes .NET portables
Silverlight
Disponible depuis 4.0
Silverlight pour Windows Phone
Disponible depuis 7.1
Windows Phone
Disponible depuis 8.1
Retour au début
Afficher: