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.
Not
Bu önizleme API'sini kullanmak için, EnablePreviewFeatures
özelliğini proje dosyanızda True
olarak ayarlayarak projenizdeki önizleme özelliklerini etkinleştirmeniz gerekir. Daha fazla bilgi için bkz. https://aka.ms/dotnet-preview-features.
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
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
- Devralma
-
Lock
- Öznitelikler
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ığı herhangi bir zamanda kilit tutabilir. Bir iş parçacığı birden çok kilidi tutabilir. Bir iş parçacığı, yinelemeli olarak olduğu gibi, kilitlenmeden önce birkaç kez kilit girebilir. Hemen bir kilidi giremez 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/finally
C# gibi özel durumlar durumunda bile kilidinden Exit çıktığından emin olun. - Kilit bir C#
async
yönteminde girilip çıkarılırken, giriş ve çıkış arasında hiçbir şey olmadığındanawait
emin olun. Kilitler iş parçacıkları tarafından tutulur ve aşağıdakiawait
kod farklı bir iş parçacığında çalıştırılabilir.
Yöntemi, EnterScope döndürülen C# using
anahtar sözcüğü gibi otomatik olarak atacak bir dil yapısıyla kullanmanız veya C# lock
anahtar sözcüğünü kullanmanız önerilir, aksi durumda kilitten çıkıldığından Lock.Scope emin olun. Bu desenlerin ve Exit
kullanı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(); }
}
}
}
Bir kilidi girmek ve çıkmak için C# lock
anahtar sözcüğünü veya benzerini kullanırken, ifadenin türü tam olarak System.Threading.Lock
olmalıdır. İfadenin türü gibi başka bir şeyse veya gibi Object
T
genel bir türse, bunun yerine değiştirilebilir olmayan farklı bir uygulama kullanılabilir (örneğin Monitor). Daha fazla bilgi için ilgili derleyici belirtimlerine bakın.
Interrupt kilit girmek için 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 başka kod çalıştırabilen ileti pompalanmasını sağlayan kilitleri bekler. Beklemelerin bazı özellikleri özel SynchronizationContextbir tarafından geçersiz kılınabilir.
Not
Özyinelemeli gibi birden çok kez de dahil olmak üzere bir kilit giren bir iş parçacığı, kilidin 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
çıkarsanız, öğesinin Lock
davranışı tanımsız hale gelir.
Dikkat
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ırayla 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 lock L1
L2
ve başka bir kod yolu iş parçacığının T2
her iki kilidi de ters sırada girdiğini düşünün. Bu senaryoda, şu olay sırasının gerçekleşmesi mümkün olabilir: girer, girer, T1
girmeye L2
L2
ve beklemeye çalışır, T2
girmeye L1
ve beklemeye çalışır. T2
L1
T1
ile arasında T1
T2
çözülemez bir kilitlenme vardır ve gelecekte iki kilit girmeye çalışan diğer iş parçacıkları da kilitlenir.
Oluşturucular
Lock() |
Lock sınıfının yeni bir örneğini başlatır. |
Özellikler
IsHeldByCurrentThread |
Kilidin geçerli iş parçacığı tarafından tutulup tutulmadığını gösteren bir değer alır. |
Yöntemler
Enter() |
Gerekirse kilit girilinceye kadar bekleyerek kilidi girer. |
EnterScope() |
Gerekirse kilit girilinceye kadar 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() |
Type Geçerli örneğini alır. (Devralındığı yer: Object) |
MemberwiseClone() |
Geçerli Objectöğesinin sığ bir kopyasını oluşturur. (Devralındığı yer: Object) |
ToString() |
Geçerli nesneyi temsil eden dizeyi döndürür. (Devralındığı yer: Object) |
TryEnter() |
Beklemeden kilidi girmeye çalışır. |
TryEnter(Int32) |
Kilidi girmeye çalışır, gerekirse kilit girilinceye kadar belirtilen sayıda milisaniye bekler. |
TryEnter(TimeSpan) |
Kilidi girmeye çalışır, gerekirse kilit girilinceye kadar veya belirtilen zaman aşımı süresi dolana kadar bekler. |