Lock Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Farklı iş parçacıkları arasındaki kod bölgelerinde karşılıklı dışlama elde etmek için bir mekanizma sağlar.
public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
- Devralma
-
Lock
Açıklamalar
sınıfı, Lock bir kaynağa eşzamanlı erişimi önlemek için genellikle kritik bölümler olarak adlandırılan bir işlemin iş parçacıkları arasında birbirini dışlayan erişim gerektiren kod bölgelerini tanımlamak için kullanılabilir.
Lock girilebilir ve çıkış yapılabilir; burada giriş ve çıkış arasındaki kod bölgesi kilitle ilişkili kritik bir bölümdür. Kilit giren bir iş parçacığı kilit çıkana kadar kilidi tutması veya sahip olduğu söylenir. En fazla bir iş parçacığı belirli bir zamanda kilit tutabilir. Bir iş parçacığı birden çok kilidi tutabilir. bir iş parçacığı, yinelemeli olarak gibi bir kilidi çıkmadan önce birden çok kez girebilir. Hemen kilit girilemedi bir iş parçacığı kilit girilene kadar veya belirtilen zaman aşımı süresi dolana kadar bekleyebilir.
Kilit girmek için veya TryEnter yöntemlerini kullanırkenEnter:
- İş parçacığının, bir blok kullanarak
try/finallyC# gibi özel durumlar durumunda bile kilitle Exit çıktığından emin olun. - Bir C#
asyncyönteminde kilit girilip çıkarılırken, giriş ve çıkış arasında hiçbir şey olmadığındanawaitemin olun. Kilitler iş parçacıkları tarafından tutulur ve aşağıdakiawaitkod farklı bir iş parçacığında çalıştırılabilir.
yöntemi, EnterScope döndürülen Lock.Scope C# anahtar sözcüğü gibi otomatik olarak atılan bir dil yapısıyla kullanılması veya C# usinglock anahtar sözcüğünü kullanmanız önerilir, aksi durumda kilitten çıkıldığından emin olun. Bu desenlerin ve Exitkullanımına Enter/TryEnter göre performans avantajları da olabilir. Aşağıdaki kod parçası, bir kilit girmek ve çıkmak için çeşitli desenleri gösterir.
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(); }
}
}
}
C# lock anahtar sözcüğünü veya bir kilit girmek ve çıkmak için benzer bir anahtar sözcüğünü kullanırken, ifadenin türü tam olarak System.Threading.Lockolmalıdır. İfadenin türü gibi başka bir şeyse veya gibi ObjectTgenel bir türse, bunun yerine değiştirilebilir olmayan farklı bir uygulama kullanılabilir (örneğin Monitor). Daha fazla bilgi için ilgili derleyici belirtimini inceleyin.
Interrupt kilit girmeyi bekleyen iş parçacıklarını kesintiye uğratabilir. Windows STA iş parçacıklarında, bekleme sırasında aynı iş parçacığında diğer kodu çalıştırabilen ileti pompalamasına izin veren kilitleri bekler. Beklemelerin bazı özellikleri özel SynchronizationContextbir tarafından geçersiz kılınabilir.
Note
Özyinelemeli gibi birden çok kez de dahil olmak üzere bir kilit giren bir iş parçacığı, kilitden tam olarak çıkmak ve diğer iş parçacıklarının kilidi girmesine izin vermek için aynı sayıda kilit çıkmalıdır. bir iş parçacığını tutarken Lockçıkarsa, öğesinin Lock davranışı tanımsız hale gelir.
Caution
Bir kod yolunda, bir iş parçacığından çıkmadan önce birden çok kilit girebilirse, aynı iş parçacığında bu kilitlerden herhangi birini girebilecek tüm kod yollarının bunları aynı sırada girdiğinden emin olun. Aksi takdirde kilitlenmelere yol açabilir. Örneğin, bir kod yolunda iş parçacığının T1 her iki kod yolundan çıkmadan önce kilit L1L2 girdiğinizi ve başka bir kod yolu iş parçacığının T2 her iki kilidi de ters sırada girdiğinizi düşünün. Bu senaryoda, şu olay sırasının gerçekleşmesi mümkün olabilir: girer, girer, girmeye çalışır ve bekler, T2 girmeye L1 ve beklemeye çalışır.L2T1L2T2L1T1 ve arasında T1T2 çözülemez bir kilitlenme vardır ve gelecekte iki kilit girmeye çalışan diğer iş parçacıkları da kilitlenir.
Oluşturucular
| Name | Description |
|---|---|
| Lock() |
Lock sınıfının yeni bir örneğini başlatır. |
Özellikler
| Name | Description |
|---|---|
| IsHeldByCurrentThread |
Kilidin geçerli iş parçacığı tarafından tutulup tutulmadığını gösteren bir değer alır. |
Yöntemler
| Name | Description |
|---|---|
| Enter() |
Kilit girilinceye kadar gerekirse bekleyerek kilidi girer. |
| EnterScope() |
Kilit girilinceye kadar gerekirse bekleyerek kilidi girer. |
| Equals(Object) |
Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler. (Devralındığı yer: Object) |
| Exit() |
Kilitlerden çıkar. |
| GetHashCode() |
Varsayılan karma işlevi işlevi görür. (Devralındığı yer: Object) |
| GetType() |
Geçerli örneğin Type alır. (Devralındığı yer: Object) |
| MemberwiseClone() |
Geçerli Objectbasit bir kopyasını oluşturur. (Devralındığı yer: Object) |
| ToString() |
Geçerli nesneyi temsil eden bir dize döndürür. (Devralındığı yer: Object) |
| TryEnter() |
Beklemeden kilidi girmeye çalışır. |
| TryEnter(Int32) |
Kilit girilinceye kadar belirtilen milisaniye sayısı için gerekirse beklerken kilidi girmeye çalışır. |
| TryEnter(TimeSpan) |
Kilidi girmeye çalışır, gerekirse kilit girilene kadar veya belirtilen zaman aşımı süresi dolana kadar bekler. |