Monitor.Wait Metod

Definition

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset.

Överlagringar

Name Description
Wait(Object, Int32, Boolean)

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön. Den här metoden anger också om synkroniseringsdomänen för kontexten (om i en synkroniserad kontext) avslutas innan väntan och återkrävs efteråt.

Wait(Object)

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset.

Wait(Object, Int32)

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön.

Wait(Object, TimeSpan)

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön.

Wait(Object, TimeSpan, Boolean)

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön. Du kan också avsluta synkroniseringsdomänen för den synkroniserade kontexten innan du väntar och hämtar domänen igen efteråt.

Wait(Object, Int32, Boolean)

Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön. Den här metoden anger också om synkroniseringsdomänen för kontexten (om i en synkroniserad kontext) avslutas innan väntan och återkrävs efteråt.

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

Parametrar

obj
Object

Objektet som du vill vänta på.

millisecondsTimeout
Int32

Antalet millisekunder som ska vänta innan tråden går in i den färdiga kön.

exitContext
Boolean

trueför att avsluta och återkräv synkroniseringsdomänen för kontexten (om i en synkroniserad kontext) före väntan. annars . false

Returer

true om låset har återkrävts innan den angivna tiden förflutit; false om låset har återkrävts efter den angivna tiden. Metoden returneras inte förrän låset har återkrävts.

Attribut

Undantag

Parametern obj är null.

Wait anropas inte inifrån ett synkroniserat kodblock.

Tråden som anropar Wait avbryts senare från väntetillståndet. Detta händer när en annan tråd anropar den här trådens Interrupt() metod.

Värdet för parametern millisecondsTimeout är negativt och är inte lika med Infinite.

Kommentarer

Wait(Object, Int32, Boolean) metod

Den här metoden returnerar inte innan den återfår ett exklusivt lås på parametern obj.

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

Tidsgränsen säkerställer att den aktuella tråden inte blockeras på obestämd tid om en annan tråd släpper låset utan att först anropa Pulse metoden eller PulseAll . Den flyttar också tråden till den färdiga kön och kringgår andra trådar framför den i väntekön, så att den kan hämta låset tidigare. Tråden kan testa returvärdet för Wait metoden för att avgöra om den återkrävde låset före tidsgränsen. Tråden kan utvärdera de villkor som gjorde att den gick in i väntetillståndet och vid behov anropa Wait metoden igen.

När en tråd anropar Wait, släpper den låset och går in i väntkön. Nu tillåts nästa tråd i den färdiga kön (om det finns en) att ta kontroll över låset. Tråden som anropade Wait finns kvar i väntekön tills antingen en tråd som innehåller låset anropar PulseAll, eller så är det nästa i kön och en tråd som innehåller låset anropar Pulse. Men om millisecondsTimeout det förflutit innan en annan tråd anropar objektets Pulse eller metoden PulseAll, flyttas den ursprungliga tråden till beredskapskön för att återfå låset.

Note

Om Infinite anges för parametern millisecondsTimeout blockeras den här metoden på obestämd tid om inte låsets innehavare anropar Pulse eller PulseAll. Om millisecondsTimeout är lika med 0 frigör tråden som anropar Wait låset och går sedan omedelbart in i kön för redo trådar för att återfå låset.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Note

Ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till väntekön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Wait(Object, TimeSpan, Boolean) metod

Den här metoden returnerar inte innan den återfår ett exklusivt lås på parametern obj.

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

Tidsgränsen säkerställer att den aktuella tråden inte blockeras på obestämd tid om en annan tråd släpper låset utan att först anropa Pulse metoden eller PulseAll . Den flyttar också tråden till den färdiga kön och kringgår andra trådar framför den i väntekön, så att den kan hämta låset tidigare. Tråden kan testa returvärdet för Wait metoden för att avgöra om den återkrävde låset före tidsgränsen. Tråden kan utvärdera de villkor som gjorde att den gick in i väntetillståndet och vid behov anropa Wait metoden igen.

När en tråd anropar Wait, släpper den låset och går in i väntkön. Nu tillåts nästa tråd i den färdiga kön (om det finns en) att ta kontroll över låset. Tråden som anropade Wait finns kvar i väntekön tills antingen en tråd som innehåller låset anropar PulseAll, eller så är det nästa i kön och en tråd som innehåller låset anropar Pulse. Men om timeout millisekunder förflutit innan en annan tråd anropar objektets Pulse eller PulseAll metoden flyttas den ursprungliga tråden till den färdiga kön för att återfå låset.

Note

Om en TimeSpan som representerar -1 millisekund anges för parametern timeout blockeras den här metoden på obestämd tid såvida inte låshållaren anropar Pulse eller PulseAll. Om timeout är 0 millisekunder, släpper tråden som anropar Wait låset och går direkt in i körkön för att återta låset.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Note

Ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till väntekön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Avsluta kontexten

Parametern exitContext har ingen effekt om inte Wait metoden anropas inifrån en nondefault-hanterad kontext. Detta kan inträffa om tråden finns i ett anrop till en instans av en klass som härletts från ContextBoundObject. Även om du kör en metod för en klass som inte härleds från ContextBoundObject, som String, kan du vara i en nondefault-kontext om en ContextBoundObject finns på stacken i den aktuella programdomänen.

När din kod körs i en icke-standardkontext och du anger true för exitContext, får detta tråden att lämna den icke-standardhanterade kontexten (det vill säga att byta till standardkontexten) innan metoden Wait exekveras. Den återgår till den ursprungliga nondefault-kontexten när anropet Wait till metoden har slutförts.

Detta kan vara användbart när den kontextbundna klassen har attributet SynchronizationAttribute tillämpat. I så fall synkroniseras alla anrop till medlemmar i klassen automatiskt och synkroniseringsdomänen är hela kodtexten för klassen. Om kod i anropsstacken för en medlem anropar Wait-metoden och anger true för exitContext, avslutar tråden synkroniseringsdomänen, så att en tråd som blockeras vid ett anrop till någon medlem i objektet kan fortsätta. Wait När metoden returneras måste tråden som gjorde anropet vänta tills synkroniseringsdomänen har återaktiviserats.

Se även

Gäller för

Wait(Object)

Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset.

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

Parametrar

obj
Object

Objektet som du vill vänta på.

Returer

true om anropet returnerades eftersom anroparen återkrävde låset för det angivna objektet. Den här metoden returnerar inte om låset inte har återkrävts.

Attribut

Undantag

Parametern obj är null.

Den anropande tråden äger inte låset för det angivna objektet.

Tråden som anropar Wait avbryts senare från väntetillståndet. Detta händer när en annan tråd anropar den här trådens Interrupt() metod.

Kommentarer

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

När en tråd anropar Waitsläpper den låset på objektet och anger objektets väntande kö. Nästa tråd i objektets redo kö (om det finns en) hämtar låset och har exklusiv användning av objektet. Alla trådar som anropar Wait finns kvar i väntekön tills de får en signal från Pulse eller PulseAll, som skickas av låsets ägare. Om Pulse skickas påverkas endast tråden längst upp i väntekön. Om PulseAll skickas påverkas alla trådar som väntar på objektet. När signalen tas emot lämnar en eller flera trådar den väntande kön och anger den färdiga kön. En tråd i den färdiga kön tillåts att återkräv låset.

Den här metoden returnerar när den anropande tråden återställer låset på objektet. Observera att den här metoden blockeras på obestämd tid om låshållaren inte anropar Pulse eller PulseAll.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Observera att ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till den väntande kön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Se även

Gäller för

Wait(Object, Int32)

Källa:
Monitor.CoreCLR.cs
Källa:
Monitor.cs
Källa:
Monitor.CoreCLR.cs
Källa:
Monitor.CoreCLR.cs
Källa:
Monitor.CoreCLR.cs

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön.

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

Parametrar

obj
Object

Objektet som du vill vänta på.

millisecondsTimeout
Int32

Antalet millisekunder som ska vänta innan tråden går in i den färdiga kön.

Returer

true om låset har återkrävts innan den angivna tiden förflutit; false om låset har återkrävts efter den angivna tiden. Metoden returneras inte förrän låset har återkrävts.

Attribut

Undantag

Parametern obj är null.

Den anropande tråden äger inte låset för det angivna objektet.

Tråden som anropar Wait avbryts senare från väntetillståndet. Detta händer när en annan tråd anropar den här trådens Interrupt() metod.

Värdet för parametern millisecondsTimeout är negativt och är inte lika med Infinite.

Kommentarer

Den här metoden returnerar inte innan den återfår ett exklusivt lås på parametern obj.

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

Tidsgränsen säkerställer att den aktuella tråden inte blockeras på obestämd tid om en annan tråd släpper låset utan att först anropa Pulse metoden eller PulseAll . Den flyttar också tråden till den färdiga kön och kringgår andra trådar framför den i väntekön, så att den kan hämta låset tidigare. Tråden kan testa returvärdet för Wait metoden för att avgöra om den återkrävde låset före tidsgränsen. Tråden kan utvärdera de villkor som gjorde att den gick in i väntetillståndet och vid behov anropa Wait metoden igen.

När en tråd anropar Waitsläpper den låset på objektet och anger objektets väntande kö. Nästa tråd i objektets redo kö (om det finns en) hämtar låset och har exklusiv användning av objektet. Tråden som anropade Wait finns kvar i väntekön tills antingen en tråd som innehåller låset anropar PulseAll, eller så är det nästa i kön och en tråd som innehåller låset anropar Pulse. Men om millisecondsTimeout det förflutit innan en annan tråd anropar objektets Pulse eller metoden PulseAll, flyttas den ursprungliga tråden till beredskapskön för att återfå låset.

Note

Om Infinite anges för parametern millisecondsTimeout blockeras den här metoden på obestämd tid om inte låsets innehavare anropar Pulse eller PulseAll. Om millisecondsTimeout är lika med 0 frigör tråden som anropar Wait låset och går sedan omedelbart in i kön för redo trådar för att återfå låset.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Note

Ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till väntekön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Se även

Gäller för

Wait(Object, TimeSpan)

Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön.

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

Parametrar

obj
Object

Objektet som du vill vänta på.

timeout
TimeSpan

En TimeSpan som representerar hur lång tid det går att vänta innan tråden går in i den färdiga kön.

Returer

true om låset har återkrävts innan den angivna tiden förflutit; false om låset har återkrävts efter den angivna tiden. Metoden returneras inte förrän låset har återkrävts.

Attribut

Undantag

Parametern obj är null.

Den anropande tråden äger inte låset för det angivna objektet.

Tråden som anropar Wait avbryts senare från väntetillståndet. Detta händer när en annan tråd anropar den här trådens Interrupt() metod.

Värdet för parametern timeout i millisekunder är negativt och representerar Infinite inte (-1 millisekunder) eller är större än Int32.MaxValue.

Kommentarer

Den här metoden returnerar inte innan den återfår ett exklusivt lås på parametern obj.

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

Tidsgränsen säkerställer att den aktuella tråden inte blockeras på obestämd tid om en annan tråd släpper låset utan att först anropa Pulse metoden eller PulseAll . Den flyttar också tråden till den färdiga kön och kringgår andra trådar framför den i väntekön, så att den kan hämta låset tidigare. Tråden kan testa returvärdet för Wait metoden för att avgöra om den återkrävde låset före tidsgränsen. Tråden kan utvärdera de villkor som gjorde att den gick in i väntetillståndet och vid behov anropa Wait metoden igen.

När en tråd anropar Waitsläpper den låset på objektet och anger objektets väntande kö. Nästa tråd i objektets redo kö (om det finns en) hämtar låset och har exklusiv användning av objektet. Tråden som anropade Wait finns kvar i väntekön tills antingen en tråd som innehåller låset anropar PulseAll, eller så är det nästa i kön och en tråd som innehåller låset anropar Pulse. Men om timeout det förflutit innan en annan tråd anropar objektets Pulse eller metoden PulseAll, flyttas den ursprungliga tråden till beredskapskön för att återfå låset.

Note

Om en TimeSpan som representerar -1 millisekund anges för parametern timeout blockeras den här metoden på obestämd tid såvida inte låshållaren anropar Pulse eller PulseAll. Om timeout är 0 millisekunder, släpper tråden som anropar Wait låset och går direkt in i körkön för att återta låset.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Note

Ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till väntekön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Se även

Gäller för

Wait(Object, TimeSpan, Boolean)

Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs
Källa:
Monitor.cs

Frigör låset på ett objekt och blockerar den aktuella tråden tills den tar igen låset. Om det angivna tidsgränsintervallet förflutit anger tråden den färdiga kön. Du kan också avsluta synkroniseringsdomänen för den synkroniserade kontexten innan du väntar och hämtar domänen igen efteråt.

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

Parametrar

obj
Object

Objektet som du vill vänta på.

timeout
TimeSpan

En TimeSpan som representerar hur lång tid det går att vänta innan tråden går in i den färdiga kön.

exitContext
Boolean

trueför att avsluta och återkräv synkroniseringsdomänen för kontexten (om i en synkroniserad kontext) före väntan. annars . false

Returer

true om låset har återkrävts innan den angivna tiden förflutit; false om låset har återkrävts efter den angivna tiden. Metoden returneras inte förrän låset har återkrävts.

Attribut

Undantag

Parametern obj är null.

Wait anropas inte inifrån ett synkroniserat kodblock.

Tråden som anropar Wait avbryts senare från väntetillståndet. Detta händer när en annan tråd anropar den här trådens Interrupt() metod.

Parametern timeout är negativ och representerar Infinite inte (-1 millisekunder) eller är större än Int32.MaxValue.

Kommentarer

Wait(Object, Int32, Boolean) metod

Den här metoden returnerar inte innan den återfår ett exklusivt lås på parametern obj.

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

Tidsgränsen säkerställer att den aktuella tråden inte blockeras på obestämd tid om en annan tråd släpper låset utan att först anropa Pulse metoden eller PulseAll . Den flyttar också tråden till den färdiga kön och kringgår andra trådar framför den i väntekön, så att den kan hämta låset tidigare. Tråden kan testa returvärdet för Wait metoden för att avgöra om den återkrävde låset före tidsgränsen. Tråden kan utvärdera de villkor som gjorde att den gick in i väntetillståndet och vid behov anropa Wait metoden igen.

När en tråd anropar Wait, släpper den låset och går in i väntkön. Nu tillåts nästa tråd i den färdiga kön (om det finns en) att ta kontroll över låset. Tråden som anropade Wait finns kvar i väntekön tills antingen en tråd som innehåller låset anropar PulseAll, eller så är det nästa i kön och en tråd som innehåller låset anropar Pulse. Men om millisecondsTimeout det förflutit innan en annan tråd anropar objektets Pulse eller metoden PulseAll, flyttas den ursprungliga tråden till beredskapskön för att återfå låset.

Note

Om Infinite anges för parametern millisecondsTimeout blockeras den här metoden på obestämd tid om inte låsets innehavare anropar Pulse eller PulseAll. Om millisecondsTimeout är lika med 0 frigör tråden som anropar Wait låset och går sedan omedelbart in i kön för redo trådar för att återfå låset.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Note

Ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till väntekön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Wait(Object, TimeSpan, Boolean) metod

Den här metoden returnerar inte innan den återfår ett exklusivt lås på parametern obj.

Tråden som för närvarande äger låset på det angivna objektet anropar den här metoden för att frigöra objektet så att en annan tråd kan komma åt det. Anroparen blockeras i väntan på att få tillbaka låset. Den här metoden anropas när anroparen behöver vänta på en tillståndsändring som inträffar till följd av en annan tråds åtgärder.

Tidsgränsen säkerställer att den aktuella tråden inte blockeras på obestämd tid om en annan tråd släpper låset utan att först anropa Pulse metoden eller PulseAll . Den flyttar också tråden till den färdiga kön och kringgår andra trådar framför den i väntekön, så att den kan hämta låset tidigare. Tråden kan testa returvärdet för Wait metoden för att avgöra om den återkrävde låset före tidsgränsen. Tråden kan utvärdera de villkor som gjorde att den gick in i väntetillståndet och vid behov anropa Wait metoden igen.

När en tråd anropar Wait, släpper den låset och går in i väntkön. Nu tillåts nästa tråd i den färdiga kön (om det finns en) att ta kontroll över låset. Tråden som anropade Wait finns kvar i väntekön tills antingen en tråd som innehåller låset anropar PulseAll, eller så är det nästa i kön och en tråd som innehåller låset anropar Pulse. Men om timeout millisekunder förflutit innan en annan tråd anropar objektets Pulse eller PulseAll metoden flyttas den ursprungliga tråden till den färdiga kön för att återfå låset.

Note

Om en TimeSpan som representerar -1 millisekund anges för parametern timeout blockeras den här metoden på obestämd tid såvida inte låshållaren anropar Pulse eller PulseAll. Om timeout är 0 millisekunder, släpper tråden som anropar Wait låset och går direkt in i körkön för att återta låset.

Anroparen kör Wait en gång, oavsett hur många gånger Enter anropats för det angivna objektet. Konceptuellt Wait lagrar metoden det antal gånger som anroparen anropade Enter objektet och anropar Exit så många gånger som det behövs för att helt frigöra det låsta objektet. Anroparen blockerar sedan i väntan på att återfå objektet. När anroparen återfår låset, anropar systemet Enter så många gånger som det behövs för att återställa det sparade Enter antalet för anroparen. När du anropar Wait frigörs låset endast för det angivna objektet. Om anroparen är ägare till lås på andra objekt släpps inte dessa lås.

Note

Ett synkroniserat objekt innehåller flera referenser, inklusive en referens till tråden som för närvarande innehåller låset, en referens till den färdiga kön, som innehåller trådarna som är redo att hämta låset och en referens till väntekön, som innehåller trådarna som väntar på meddelande om en ändring i objektets tillstånd.

Metoderna Pulse, PulseAlloch Wait måste anropas inifrån ett synkroniserat kodblock.

Kommentarerna för Pulse metoden förklarar vad som händer om Pulse anropas när inga trådar väntar.

Avsluta kontexten

Parametern exitContext har ingen effekt om inte Wait metoden anropas inifrån en nondefault-hanterad kontext. Detta kan inträffa om tråden finns i ett anrop till en instans av en klass som härletts från ContextBoundObject. Även om du kör en metod för en klass som inte härleds från ContextBoundObject, som String, kan du vara i en nondefault-kontext om en ContextBoundObject finns på stacken i den aktuella programdomänen.

När din kod körs i en icke-standardkontext och du anger true för exitContext, får detta tråden att lämna den icke-standardhanterade kontexten (det vill säga att byta till standardkontexten) innan metoden Wait exekveras. Den återgår till den ursprungliga nondefault-kontexten när anropet Wait till metoden har slutförts.

Detta kan vara användbart när den kontextbundna klassen har attributet SynchronizationAttribute tillämpat. I så fall synkroniseras alla anrop till medlemmar i klassen automatiskt och synkroniseringsdomänen är hela kodtexten för klassen. Om kod i anropsstacken för en medlem anropar Wait-metoden och anger true för exitContext, avslutar tråden synkroniseringsdomänen, så att en tråd som blockeras vid ett anrop till någon medlem i objektet kan fortsätta. Wait När metoden returneras måste tråden som gjorde anropet vänta tills synkroniseringsdomänen har återaktiviserats.

Se även

Gäller för