Aracılığıyla paylaş


Lock Sınıf

Tanım

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ığından await emin olun. Kilitler iş parçacıkları tarafından tutulur ve aşağıdaki await 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 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(); }
        }
    }
}

Bir kilidi girmek ve çıkmak için C# lock anahtar sözcüğünü veya benzerini 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 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 L1L2 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 L2L2ve beklemeye çalışır, T2 girmeye L1 ve beklemeye çalışır. T2L1T1 ile 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

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.

Şunlara uygulanır