Monitor.Wait Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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
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
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
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
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
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.