Lock Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Tillhandahåller en mekanism för att uppnå ömsesidig uteslutning i kodregioner mellan olika trådar.
public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
- Arv
-
Lock
Kommentarer
Klassen Lock kan användas för att definiera kodregioner som kräver ömsesidigt exklusiv åtkomst mellan trådar i en process, som ofta kallas kritiska avsnitt, för att förhindra samtidig åtkomst till en resurs. A Lock kan anges och avslutas, där kodområdet mellan returen och avslutet är ett kritiskt avsnitt som är associerat med låset. En tråd som går in i ett lås sägs hålla eller äga låset tills det lämnar låset. Högst en tråd kan hålla ett lås vid en viss tidpunkt. En tråd kan innehålla flera lås. En tråd kan ange ett lås flera gånger innan den avslutas, till exempel rekursivt. En tråd som inte kan ange ett lås omedelbart kan vänta tills låset kan anges eller tills en angiven tidsgräns upphör att gälla.
När du använder Enter metoderna eller TryEnter för att ange ett lås:
- Se till att tråden avslutar låset även Exit om det finns undantag, till exempel i C# med hjälp av ett
try/finallyblock. - När låset matas in och avslutas i en C#
async-metod kontrollerar du att det inte finns någonawaitmellan returen och avslutet. Lås hålls av trådar och koden som följer enawaitkan köras på en annan tråd.
Vi rekommenderar att du använder EnterScope metoden med en språkkonstruktion som automatiskt tar bort det returnerade Lock.Scope , till exempel nyckelordet C# using eller använder nyckelordet C# lock eftersom dessa säkerställer att låset avslutas i undantagsfall. Dessa mönster kan också ha prestandafördelar jämfört med att använda Enter/TryEnter och Exit. Följande kodfragment illustrerar olika mönster för att ange och avsluta ett lås.
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
När du använder nyckelordet C# lock eller liknande för att ange och avsluta ett lås måste uttryckets typ vara exakt System.Threading.Lock. Om uttryckets typ är något annat, till exempel Object eller en allmän typ som T, kan en annan implementering som inte är utbytbar användas i stället (till exempel Monitor). Mer information finns i relevant kompilatorspecifikation.
Interrupt kan avbryta trådar som väntar på att ange ett lås. På Windows STA-trådar tillåter väntan på lås meddelandepumpning som kan köra annan kod på samma tråd under en väntan. Vissa funktioner i väntetiderna kan åsidosättas av en anpassad SynchronizationContext.
Note
En tråd som går in i ett lås, inklusive flera gånger, till exempel rekursivt, måste avsluta låset samma antal gånger för att helt avsluta låset och låta andra trådar komma in i låset. Om en tråd avslutas medan du håller i en Lockblir beteendet för det Lock odefinierat.
Caution
Om en tråd på en kodsökväg kan ange flera lås innan de avslutas kontrollerar du att alla kodsökvägar som kan ange två av dessa lås i samma tråd anger dem i samma ordning. Annars kan det leda till dödlägen. Tänk till exempel på att på en kodsökvägstråd T1 anger lås L1 och lås L2 innan båda avslutas, och på en annan kodsökvägstråd T2 anges båda låsen i omvänd ordning. I det scenariot skulle det vara möjligt att följande händelseordning inträffar: anger , anger , försöker ange L2 och väntar, T2 försöker ange L1 och vänta. T1L2T2L1T1 Det finns ett dödläge mellan T1 och T2 som inte kan lösas, och andra trådar som försöker ange något av låsen i framtiden kommer också att hänga.
Konstruktorer
| Name | Description |
|---|---|
| Lock() |
Initierar en ny instans av Lock klassen. |
Egenskaper
| Name | Description |
|---|---|
| IsHeldByCurrentThread |
Hämtar ett värde som anger om låset hålls av den aktuella tråden. |
Metoder
| Name | Description |
|---|---|
| Enter() |
Anger låset och väntar vid behov tills låset kan anges. |
| EnterScope() |
Anger låset och väntar vid behov tills låset kan anges. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| Exit() |
Avslutar låset. |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| TryEnter() |
Försöker ange låset utan att vänta. |
| TryEnter(Int32) |
Försöker ange låset och väntar vid behov på det angivna antalet millisekunder tills låset kan anges. |
| TryEnter(TimeSpan) |
Försöker ange låset, väntar vid behov tills låset kan anges eller tills den angivna tidsgränsen upphör att gälla. |