Monitor.Wait Méthode

Définition

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou.

Surcharges

Wait(Object, Int32, Boolean)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle. Cette méthode spécifie également si le domaine de synchronisation associé au contexte (dans le cas d’un contexte synchronisé) est abandonné avant l’attente et acquis à nouveau par la suite.

Wait(Object)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou.

Wait(Object, Int32)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle.

Wait(Object, TimeSpan)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle.

Wait(Object, TimeSpan, Boolean)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle. Le domaine de synchronisation associé au contexte synchronisé peut être abandonné avant l’attente et acquis de nouveau par la suite.

Wait(Object, Int32, Boolean)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle. Cette méthode spécifie également si le domaine de synchronisation associé au contexte (dans le cas d’un contexte synchronisé) est abandonné avant l’attente et acquis à nouveau par la suite.

public:
 static bool Wait(System::Object ^ obj, int millisecondsTimeout, bool exitContext);
public static bool Wait (object obj, int millisecondsTimeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj, int millisecondsTimeout, bool exitContext);
static member Wait : obj * int * bool -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * int * bool -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer, exitContext As Boolean) As Boolean

Paramètres

obj
Object

Objet sur lequel attendre.

millisecondsTimeout
Int32

Nombre de millisecondes à attendre avant que le thread intègre la file d'attente opérationnelle.

exitContext
Boolean

true pour abandonner et acquérir à nouveau le domaine de synchronisation associé au contexte (dans le cas d'un contexte synchronisé) avant l'attente ; sinon, false.

Retours

Boolean

true si le verrou a fait l'objet d'une nouvelle acquisition avant l'expiration du délai spécifié ; false si le verrou a fait l'objet d'une nouvelle acquisition après l'expiration du délai spécifié. La méthode ne retourne pas de valeur tant que le verrou n'est pas acquis à nouveau.

Attributs

Exceptions

Le paramètre obj a la valeur null.

Wait n’est pas appelé à partir d’un bloc de code synchronisé.

Le thread qui appelle Wait quitte ensuite l'état d'attente. Cela se produit lorsqu’un autre thread appelle la méthode Interrupt() de ce thread.

La valeur du paramètre millisecondsTimeout est négative et différente de Infinite.

Remarques

Cette méthode ne retourne pas tant qu’elle n’accepte pas de nouveau un verrou exclusif sur le obj paramètre .

Le thread qui possède actuellement le verrou sur l’objet spécifié appelle cette méthode afin de libérer l’objet afin qu’un autre thread puisse y accéder. L’appelant est bloqué en attendant d’obtenir à nouveau le verrou. Cette méthode est appelée lorsque l’appelant doit attendre qu’un changement d’état se produise à la suite des opérations d’un autre thread.

Le délai d’attente garantit que le thread actuel ne se bloque pas indéfiniment si un autre thread libère le verrou sans appeler au préalable la Pulse méthode ou PulseAll . Il déplace également le thread vers la file d’attente prête, en contournant les autres threads devant lui dans la file d’attente, afin qu’il puisse réacquire le verrou plus tôt. Le thread peut tester la valeur de retour de la Wait méthode pour déterminer s’il a réacquis le verrou avant le délai d’attente. Le thread peut évaluer les conditions qui l’ont amené à entrer dans l’attente et, si nécessaire, appeler à nouveau la Wait méthode.

Lorsqu’un thread appelle Wait, il libère le verrou et entre dans la file d’attente. À ce stade, le thread suivant dans la file d’attente prête (le cas échéant) est autorisé à prendre le contrôle du verrou. Le thread qui a Wait appelé reste dans la file d’attente jusqu’à ce qu’un thread qui contient le verrou appelle PulseAll, soit il est le suivant dans la file d’attente et un thread qui contient le verrou appelle Pulse. Toutefois, s’il millisecondsTimeout s’écoule avant qu’un autre thread appelle la méthode de Pulse cet objet ou PulseAll de cette méthode, le thread d’origine est déplacé vers la file d’attente prête afin de récupérer le verrou.

Notes

Si Infinite est spécifié pour le millisecondsTimeout paramètre , cette méthode se bloque indéfiniment, sauf si le détenteur du verrou appelle Pulse ou PulseAll. Si millisecondsTimeout est égal à 0, le thread qui appelle Wait libère le verrou, puis entre immédiatement dans la file d’attente prête pour récupérer le verrou.

L’appelant s’exécute Wait une seule fois, quel que soit le nombre d’appels Enter pour l’objet spécifié. Conceptuellement, la Wait méthode stocke le nombre de fois que l’appelant a appelé Enter sur l’objet et appelle Exit autant de fois que nécessaire pour libérer entièrement l’objet verrouillé. L’appelant se bloque alors en attendant de réacquire l’objet. Lorsque l’appelant réacquisit le verrou, le système appelle Enter autant de fois que nécessaire pour restaurer le nombre enregistré Enter pour l’appelant. L’appel Wait libère le verrou pour l’objet spécifié uniquement ; si l’appelant est le propriétaire des verrous sur d’autres objets, ces verrous ne sont pas libérés.

Notes

Un objet synchronisé contient plusieurs références, notamment une référence au thread qui contient actuellement le verrou, une référence à la file d’attente prête, qui contient les threads prêts à obtenir le verrou, et une référence à la file d’attente, qui contient les threads en attente de notification d’une modification de l’état de l’objet.

Les Pulseméthodes , PulseAllet Wait doivent être appelées à partir d’un bloc de code synchronisé.

Les remarques relatives à la Pulse méthode expliquent ce qui se passe si Pulse est appelé quand aucun thread n’est en attente.

Remarques sur la sortie du contexte

LeexitContext paramètre n’a aucun effet, sauf si la Wait méthode est appelée à partir d’un contexte managé non défini par défaut. Cela peut se produire si votre thread se trouve à l’intérieur d’un appel à une instance d’une classe dérivée de ContextBoundObject. Même si vous exécutez actuellement une méthode sur une classe qui n’est pas dérivée de ContextBoundObject, comme String, vous pouvez être dans un contexte non défini par défaut si un ContextBoundObject se trouve sur votre pile dans le domaine d’application actuel.

Lorsque votre code s’exécute dans un contexte non défini par défaut, la spécification true de pour exitContext entraîne la fermeture du thread du contexte managé non par défaut (autrement dit, pour passer au contexte par défaut) avant l’exécution de la Wait méthode. Elle retourne au contexte non par défaut d’origine une fois l’appel à la Wait méthode terminé.

Cela peut être utile lorsque l’attribut est appliqué à la SynchronizationAttribute classe contextuelle. Dans ce cas, tous les appels aux membres de la classe sont automatiquement synchronisés, et le domaine de synchronisation est le corps entier du code de la classe. Si le code dans la pile des appels d’un membre appelle la Wait méthode et spécifie true pour exitContext, le thread quitte le domaine de synchronisation, ce qui permet à un thread bloqué lors d’un appel à un membre de l’objet de continuer. Lorsque la Wait méthode retourne, le thread qui a effectué l’appel doit attendre pour revenir dans le domaine de synchronisation.

Voir aussi

S’applique à

Wait(Object)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou.

public:
 static bool Wait(System::Object ^ obj);
public static bool Wait (object obj);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj);
static member Wait : obj -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj -> bool
Public Shared Function Wait (obj As Object) As Boolean

Paramètres

obj
Object

Objet sur lequel attendre.

Retours

Boolean

true si l'appel est retourné parce que l'appelant a de nouveau acquis le verrou pour l'objet spécifié. Cette méthode ne retourne rien si le verrou n'est pas acquis à nouveau.

Attributs

Exceptions

Le paramètre obj a la valeur null.

Le thread appelant ne possède pas le verrou pour l'objet spécifié.

Le thread qui appelle Wait quitte ensuite l'état d'attente. Cela se produit lorsqu’un autre thread appelle la méthode Interrupt() de ce thread.

Remarques

Le thread qui possède actuellement le verrou sur l’objet spécifié appelle cette méthode afin de libérer l’objet afin qu’un autre thread puisse y accéder. L’appelant est bloqué en attendant d’obtenir à nouveau le verrou. Cette méthode est appelée lorsque l’appelant doit attendre qu’un changement d’état se produise à la suite des opérations d’un autre thread.

Lorsqu’un thread appelle Wait, il libère le verrou sur l’objet et entre dans la file d’attente de l’objet. Le thread suivant dans la file d’attente prête de l’objet (le cas échéant) acquiert le verrou et a une utilisation exclusive de l’objet. Tous les threads qui appellent Wait restent dans la file d’attente jusqu’à ce qu’ils reçoivent un signal de Pulse ou PulseAll, envoyé par le propriétaire du verrou. Si Pulse est envoyé, seul le thread en tête de la file d’attente est affecté. Si PulseAll est envoyé, tous les threads en attente de l’objet sont affectés. Lorsque le signal est reçu, un ou plusieurs threads quittent la file d’attente et entrent dans la file d’attente prête. Un thread dans la file d’attente prête est autorisé à réacquire le verrou.

Cette méthode retourne lorsque le thread appelant réacquisit le verrou sur l’objet . Notez que cette méthode se bloque indéfiniment si le détenteur du verrou n’appelle Pulse pas ou PulseAll.

L’appelant s’exécute Wait une seule fois, quel que soit le nombre d’appels Enter pour l’objet spécifié. Conceptuellement, la Wait méthode stocke le nombre de fois que l’appelant a appelé Enter sur l’objet et appelle Exit autant de fois que nécessaire pour libérer entièrement l’objet verrouillé. L’appelant se bloque alors en attendant de réacquire l’objet. Lorsque l’appelant réacquisit le verrou, le système appelle Enter autant de fois que nécessaire pour restaurer le nombre enregistré Enter pour l’appelant. L’appel Wait libère le verrou pour l’objet spécifié uniquement ; si l’appelant est le propriétaire des verrous sur d’autres objets, ces verrous ne sont pas libérés.

Notez qu’un objet synchronisé contient plusieurs références, notamment une référence au thread qui contient actuellement le verrou, une référence à la file d’attente prête, qui contient les threads prêts à obtenir le verrou, et une référence à la file d’attente, qui contient les threads en attente de notification d’une modification de l’état de l’objet.

Les Pulseméthodes , PulseAllet Wait doivent être appelées à partir d’un bloc de code synchronisé.

Les remarques relatives à la Pulse méthode expliquent ce qui se passe si Pulse est appelé quand aucun thread n’est en attente.

Voir aussi

S’applique à

Wait(Object, Int32)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle.

public:
 static bool Wait(System::Object ^ obj, int millisecondsTimeout);
public static bool Wait (object obj, int millisecondsTimeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj, int millisecondsTimeout);
static member Wait : obj * int -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * int -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer) As Boolean

Paramètres

obj
Object

Objet sur lequel attendre.

millisecondsTimeout
Int32

Nombre de millisecondes à attendre avant que le thread intègre la file d'attente opérationnelle.

Retours

Boolean

true si le verrou a fait l'objet d'une nouvelle acquisition avant l'expiration du délai spécifié ; false si le verrou a fait l'objet d'une nouvelle acquisition après l'expiration du délai spécifié. La méthode ne retourne pas de valeur tant que le verrou n'est pas acquis à nouveau.

Attributs

Exceptions

Le paramètre obj a la valeur null.

Le thread appelant ne possède pas le verrou pour l'objet spécifié.

Le thread qui appelle Wait quitte ensuite l'état d'attente. Cela se produit lorsqu’un autre thread appelle la méthode Interrupt() de ce thread.

La valeur du paramètre millisecondsTimeout est négative et différente de Infinite.

Remarques

Cette méthode ne retourne pas tant qu’elle n’accepte pas de nouveau un verrou exclusif sur le obj paramètre .

Le thread qui possède actuellement le verrou sur l’objet spécifié appelle cette méthode afin de libérer l’objet afin qu’un autre thread puisse y accéder. L’appelant est bloqué en attendant d’obtenir à nouveau le verrou. Cette méthode est appelée lorsque l’appelant doit attendre qu’un changement d’état se produise à la suite des opérations d’un autre thread.

Le délai d’attente garantit que le thread actuel ne se bloque pas indéfiniment si un autre thread libère le verrou sans appeler au préalable la Pulse méthode ou PulseAll . Il déplace également le thread vers la file d’attente prête, en contournant les autres threads devant lui dans la file d’attente, afin qu’il puisse réacquire le verrou plus tôt. Le thread peut tester la valeur de retour de la Wait méthode pour déterminer s’il a réacquis le verrou avant le délai d’attente. Le thread peut évaluer les conditions qui l’ont amené à entrer dans l’attente et, si nécessaire, appeler à nouveau la Wait méthode.

Lorsqu’un thread appelle Wait, il libère le verrou sur l’objet et entre dans la file d’attente de l’objet. Le thread suivant dans la file d’attente prête de l’objet (le cas échéant) acquiert le verrou et a une utilisation exclusive de l’objet. Le thread qui a Wait appelé reste dans la file d’attente jusqu’à ce qu’un thread qui contient le verrou appelle PulseAll, soit il est le suivant dans la file d’attente et un thread qui contient le verrou appelle Pulse. Toutefois, s’il millisecondsTimeout s’écoule avant qu’un autre thread appelle la méthode de Pulse cet objet ou PulseAll de cette méthode, le thread d’origine est déplacé vers la file d’attente prête afin de récupérer le verrou.

Notes

Si Infinite est spécifié pour le millisecondsTimeout paramètre , cette méthode se bloque indéfiniment, sauf si le détenteur du verrou appelle Pulse ou PulseAll. Si millisecondsTimeout est égal à 0, le thread qui appelle Wait libère le verrou, puis entre immédiatement dans la file d’attente prête pour récupérer le verrou.

L’appelant s’exécute Wait une seule fois, quel que soit le nombre d’appels Enter pour l’objet spécifié. Conceptuellement, la Wait méthode stocke le nombre de fois que l’appelant a appelé Enter sur l’objet et appelle Exit autant de fois que nécessaire pour libérer entièrement l’objet verrouillé. L’appelant se bloque alors en attendant de réacquire l’objet. Lorsque l’appelant réacquisit le verrou, le système appelle Enter autant de fois que nécessaire pour restaurer le nombre enregistré Enter pour l’appelant. L’appel Wait libère le verrou pour l’objet spécifié uniquement ; si l’appelant est le propriétaire des verrous sur d’autres objets, ces verrous ne sont pas libérés.

Notes

Un objet synchronisé contient plusieurs références, notamment une référence au thread qui contient actuellement le verrou, une référence à la file d’attente prête, qui contient les threads prêts à obtenir le verrou, et une référence à la file d’attente, qui contient les threads en attente de notification d’une modification de l’état de l’objet.

Les Pulseméthodes , PulseAllet Wait doivent être appelées à partir d’un bloc de code synchronisé.

Les remarques relatives à la Pulse méthode expliquent ce qui se passe si Pulse est appelé quand aucun thread n’est en attente.

Voir aussi

S’applique à

Wait(Object, TimeSpan)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle.

public:
 static bool Wait(System::Object ^ obj, TimeSpan timeout);
public static bool Wait (object obj, TimeSpan timeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj, TimeSpan timeout);
static member Wait : obj * TimeSpan -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * TimeSpan -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan) As Boolean

Paramètres

obj
Object

Objet sur lequel attendre.

timeout
TimeSpan

TimeSpan qui représente le temps à attendre avant que le thread n'intègre la file d'attente opérationnelle.

Retours

Boolean

true si le verrou a fait l'objet d'une nouvelle acquisition avant l'expiration du délai spécifié ; false si le verrou a fait l'objet d'une nouvelle acquisition après l'expiration du délai spécifié. La méthode ne retourne pas de valeur tant que le verrou n'est pas acquis à nouveau.

Attributs

Exceptions

Le paramètre obj a la valeur null.

Le thread appelant ne possède pas le verrou pour l'objet spécifié.

Le thread qui appelle Wait quitte ensuite l'état d'attente. Cela se produit lorsqu’un autre thread appelle la méthode Interrupt() de ce thread.

La valeur du timeout paramètre en millisecondes est négative et ne représente Infinite pas (-1 milliseconde) ou est supérieure à Int32.MaxValue.

Remarques

Cette méthode ne retourne pas tant qu’elle n’accepte pas de nouveau un verrou exclusif sur le obj paramètre .

Le thread qui possède actuellement le verrou sur l’objet spécifié appelle cette méthode afin de libérer l’objet afin qu’un autre thread puisse y accéder. L’appelant est bloqué en attendant d’obtenir à nouveau le verrou. Cette méthode est appelée lorsque l’appelant doit attendre qu’un changement d’état se produise à la suite des opérations d’un autre thread.

Le délai d’attente garantit que le thread actuel ne se bloque pas indéfiniment si un autre thread libère le verrou sans appeler au préalable la Pulse méthode ou PulseAll . Il déplace également le thread vers la file d’attente prête, en contournant les autres threads devant lui dans la file d’attente, afin qu’il puisse réacquire le verrou plus tôt. Le thread peut tester la valeur de retour de la Wait méthode pour déterminer s’il a réacquis le verrou avant le délai d’attente. Le thread peut évaluer les conditions qui l’ont amené à entrer dans l’attente et, si nécessaire, appeler à nouveau la Wait méthode.

Lorsqu’un thread appelle Wait, il libère le verrou sur l’objet et entre dans la file d’attente de l’objet. Le thread suivant dans la file d’attente prête de l’objet (le cas échéant) acquiert le verrou et a une utilisation exclusive de l’objet. Le thread qui a Wait appelé reste dans la file d’attente jusqu’à ce qu’un thread qui contient le verrou appelle PulseAll, soit il est le suivant dans la file d’attente et un thread qui contient le verrou appelle Pulse. Toutefois, s’il timeout s’écoule avant qu’un autre thread appelle la méthode de Pulse cet objet ou PulseAll de cette méthode, le thread d’origine est déplacé vers la file d’attente prête afin de récupérer le verrou.

Notes

Si un TimeSpan représentant -1 milliseconde est spécifié pour le timeout paramètre, cette méthode se bloque indéfiniment, sauf si le détenteur du verrou appelle Pulse ou PulseAll. Si timeout la valeur est de 0 milliseconde, le thread qui appelle Wait libère le verrou, puis entre immédiatement dans la file d’attente prête pour récupérer le verrou.

L’appelant s’exécute Wait une seule fois, quel que soit le nombre d’appels Enter pour l’objet spécifié. Conceptuellement, la Wait méthode stocke le nombre de fois que l’appelant a appelé Enter sur l’objet et appelle Exit autant de fois que nécessaire pour libérer entièrement l’objet verrouillé. L’appelant se bloque alors en attendant de réacquire l’objet. Lorsque l’appelant réacquisit le verrou, le système appelle Enter autant de fois que nécessaire pour restaurer le nombre enregistré Enter pour l’appelant. L’appel Wait libère le verrou pour l’objet spécifié uniquement ; si l’appelant est le propriétaire des verrous sur d’autres objets, ces verrous ne sont pas libérés.

Notes

Un objet synchronisé contient plusieurs références, notamment une référence au thread qui contient actuellement le verrou, une référence à la file d’attente prête, qui contient les threads prêts à obtenir le verrou, et une référence à la file d’attente, qui contient les threads en attente de notification d’une modification de l’état de l’objet.

Les Pulseméthodes , PulseAllet Wait doivent être appelées à partir d’un bloc de code synchronisé.

Les remarques relatives à la Pulse méthode expliquent ce qui se passe si Pulse est appelé quand aucun thread n’est en attente.

Voir aussi

S’applique à

Wait(Object, TimeSpan, Boolean)

Libère le verrou d’un objet et bloque le thread actuel jusqu’à ce qu’il acquière à nouveau le verrou. Si le délai d'attente spécifié est écoulé, le thread intègre la file d'attente opérationnelle. Le domaine de synchronisation associé au contexte synchronisé peut être abandonné avant l’attente et acquis de nouveau par la suite.

public:
 static bool Wait(System::Object ^ obj, TimeSpan timeout, bool exitContext);
public static bool Wait (object obj, TimeSpan timeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj, TimeSpan timeout, bool exitContext);
static member Wait : obj * TimeSpan * bool -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * TimeSpan * bool -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan, exitContext As Boolean) As Boolean

Paramètres

obj
Object

Objet sur lequel attendre.

timeout
TimeSpan

TimeSpan qui représente le temps à attendre avant que le thread n'intègre la file d'attente opérationnelle.

exitContext
Boolean

true pour abandonner et acquérir à nouveau le domaine de synchronisation associé au contexte (dans le cas d'un contexte synchronisé) avant l'attente ; sinon, false.

Retours

Boolean

true si le verrou a fait l'objet d'une nouvelle acquisition avant l'expiration du délai spécifié ; false si le verrou a fait l'objet d'une nouvelle acquisition après l'expiration du délai spécifié. La méthode ne retourne pas de valeur tant que le verrou n'est pas acquis à nouveau.

Attributs

Exceptions

Le paramètre obj a la valeur null.

Wait n’est pas appelé à partir d’un bloc de code synchronisé.

Le thread qui appelle Wait quitte ensuite l’état d’attente. Cela se produit lorsqu’un autre thread appelle la méthode Interrupt() de ce thread.

Le timeout paramètre est négatif et ne représente Infinite pas (-1 milliseconde) ou est supérieur à Int32.MaxValue.

Remarques

Cette méthode ne retourne pas tant qu’elle n’accepte pas de nouveau un verrou exclusif sur le obj paramètre .

Le thread qui possède actuellement le verrou sur l’objet spécifié appelle cette méthode afin de libérer l’objet afin qu’un autre thread puisse y accéder. L’appelant est bloqué en attendant d’obtenir à nouveau le verrou. Cette méthode est appelée lorsque l’appelant doit attendre qu’un changement d’état se produise à la suite des opérations d’un autre thread.

Le délai d’attente garantit que le thread actuel ne se bloque pas indéfiniment si un autre thread libère le verrou sans appeler au préalable la Pulse méthode ou PulseAll . Il déplace également le thread vers la file d’attente prête, en contournant les autres threads devant lui dans la file d’attente, afin qu’il puisse réacquire le verrou plus tôt. Le thread peut tester la valeur de retour de la Wait méthode pour déterminer s’il a réacquis le verrou avant le délai d’attente. Le thread peut évaluer les conditions qui l’ont amené à entrer dans l’attente et, si nécessaire, appeler à nouveau la Wait méthode.

Lorsqu’un thread appelle Wait, il libère le verrou et entre dans la file d’attente. À ce stade, le thread suivant dans la file d’attente prête (le cas échéant) est autorisé à prendre le contrôle du verrou. Le thread qui a Wait appelé reste dans la file d’attente jusqu’à ce qu’un thread qui contient le verrou appelle PulseAll, soit il est le suivant dans la file d’attente et un thread qui contient le verrou appelle Pulse. Toutefois, si timeout des millisecondes s’écoulent avant qu’un autre thread appelle la méthode de Pulse cet objet ou PulseAll de cet objet, le thread d’origine est déplacé vers la file d’attente prête afin de récupérer le verrou.

Notes

Si un TimeSpan représentant -1 milliseconde est spécifié pour le timeout paramètre, cette méthode se bloque indéfiniment, sauf si le détenteur du verrou appelle Pulse ou PulseAll. Si timeout la valeur est de 0 milliseconde, le thread qui appelle Wait libère le verrou, puis entre immédiatement dans la file d’attente prête pour récupérer le verrou.

L’appelant s’exécute Wait une seule fois, quel que soit le nombre d’appels Enter pour l’objet spécifié. Conceptuellement, la Wait méthode stocke le nombre de fois que l’appelant a appelé Enter sur l’objet et appelle Exit autant de fois que nécessaire pour libérer entièrement l’objet verrouillé. L’appelant se bloque alors en attendant de réacquire l’objet. Lorsque l’appelant réacquisit le verrou, le système appelle Enter autant de fois que nécessaire pour restaurer le nombre enregistré Enter pour l’appelant. L’appel Wait libère le verrou pour l’objet spécifié uniquement ; si l’appelant est le propriétaire des verrous sur d’autres objets, ces verrous ne sont pas libérés.

Notes

Un objet synchronisé contient plusieurs références, notamment une référence au thread qui contient actuellement le verrou, une référence à la file d’attente prête, qui contient les threads prêts à obtenir le verrou, et une référence à la file d’attente, qui contient les threads en attente de notification d’une modification de l’état de l’objet.

Les Pulseméthodes , PulseAllet Wait doivent être appelées à partir d’un bloc de code synchronisé.

Les remarques relatives à la Pulse méthode expliquent ce qui se passe si Pulse est appelé quand aucun thread n’est en attente.

Remarques sur la sortie du contexte

LeexitContext paramètre n’a aucun effet, sauf si la Wait méthode est appelée à partir d’un contexte managé non défini par défaut. Cela peut se produire si votre thread se trouve à l’intérieur d’un appel à une instance d’une classe dérivée de ContextBoundObject. Même si vous exécutez actuellement une méthode sur une classe qui n’est pas dérivée de ContextBoundObject, comme String, vous pouvez être dans un contexte non défini par défaut si un ContextBoundObject se trouve sur votre pile dans le domaine d’application actuel.

Lorsque votre code s’exécute dans un contexte non défini par défaut, la spécification true de pour exitContext entraîne la fermeture du thread du contexte managé non par défaut (autrement dit, pour passer au contexte par défaut) avant l’exécution de la Wait méthode. Elle retourne au contexte non par défaut d’origine une fois l’appel à la Wait méthode terminé.

Cela peut être utile lorsque l’attribut est appliqué à la SynchronizationAttribute classe contextuelle. Dans ce cas, tous les appels aux membres de la classe sont automatiquement synchronisés, et le domaine de synchronisation est le corps entier du code de la classe. Si le code dans la pile des appels d’un membre appelle la Wait méthode et spécifie true pour exitContext, le thread quitte le domaine de synchronisation, ce qui permet à un thread bloqué lors d’un appel à un membre de l’objet de continuer. Lorsque la Wait méthode retourne, le thread qui a effectué l’appel doit attendre pour revenir dans le domaine de synchronisation.

Voir aussi

S’applique à