İngilizce dilinde oku

Aracılığıyla paylaş


LockRecursionPolicy Sabit listesi

Tanım

Bir kilidin aynı iş parçacığı tarafından birden çok kez girilip girilemeyeceğini belirtir.

C#
public enum LockRecursionPolicy
Devralma
LockRecursionPolicy

Alanlar

NoRecursion 0

bir iş parçacığı yinelemeli olarak bir kilit girmeye çalışırsa, bir özel durum oluşturulur. Bu ayar etkin olduğunda bazı sınıflar belirli özyinelemelere izin verebilir.

SupportsRecursion 1

bir iş parçacığı yinelemeli olarak bir kilit girebilir. Bazı sınıflar bu özelliği kısıtlayabilir.

Örnekler

Aşağıdaki örnekte biri ayara bağlı LockRecursionPolicy diğeri olmayan iki özel durum senaryosu gösterilmektedir.

İlk senaryoda, iş parçacığı kilit okuma moduna girer ve sonra yinelemeli olarak okuma moduna girmeye çalışır. ReaderWriterLockSlim, özyineleme ilkesini NoRecursion olarak ayarlayan parametresiz oluşturucu kullanılarak oluşturulursa, bir özel durum oluşturulur. SupportsRecursion öğesini oluşturmak ReaderWriterLockSlimiçin kullanılırsa, hiçbir özel durum oluşturulmaz.

İkinci senaryoda, iş parçacığı kilidi okuma moduna girer ve ardından yazma moduna girmeye çalışır. LockRecursionException , kilit özyineleme ilkesinden bağımsız olarak oluşturulur.

C#
using System;
using System.Threading;

class Example
{
    // By default, the lock recursion policy for a new 
    // ReaderWriterLockSlim does not allow recursion.
    private static ReaderWriterLockSlim rwls = new ReaderWriterLockSlim();
    private static ReaderWriterLockSlim rwlsWithRecursion =
        new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);

    static void ThreadProc()
    { 
        Console.WriteLine("1. Enter the read lock recursively.");
        ReadRecursive(rwls);
        ReadRecursive(rwlsWithRecursion);

        Console.WriteLine("\n2. Enter the write lock recursively from the read lock.");
        ReadWriteRecursive(rwls);
        ReadWriteRecursive(rwlsWithRecursion);
    } 

    static void ReadRecursive(ReaderWriterLockSlim rwls)
    {
        Console.WriteLine("LockRecursionPolicy.{0}:", rwls.RecursionPolicy);
        rwls.EnterReadLock();

        try {
            rwls.EnterReadLock();
            Console.WriteLine("\nThe read lock was entered recursively.");
            rwls.ExitReadLock();
        }    
        catch (LockRecursionException lre) {
            Console.WriteLine("\n{0}: {1}",
                lre.GetType().Name, lre.Message);
        }

        rwls.ExitReadLock();
    }

    static void ReadWriteRecursive(ReaderWriterLockSlim rwls)
    {
        Console.WriteLine("LockRecursionPolicy.{0}:", rwls.RecursionPolicy);
        rwls.EnterReadLock();

        try {
            rwls.EnterWriteLock();
            Console.WriteLine("\nThe write lock was entered recursively.");
        }
        catch (LockRecursionException lre) {
            Console.WriteLine("\n{0}: {1}", 
                lre.GetType().Name, lre.Message);
        }

        rwls.ExitReadLock();
    }

    static void Main() 
    {
        Thread t = new Thread(ThreadProc);
        t.Start();
        t.Join();
        
        // Dispose of ReaderWriterLockSlim objects' unmanaged resources.
        if (rwls != null) rwls.Dispose();
        if (rwlsWithRecursion != null) rwlsWithRecursion.Dispose();
    } 
} 
// This example displays output similar to the following:
//    1. Enter the read lock recursively.
//    LockRecursionPolicy.NoRecursion:
//    
//    LockRecursionException: Recursive read lock acquisitions not allowed in this mode.
//    LockRecursionPolicy.SupportsRecursion:
//    
//    The read lock was entered recursively.
//    
//    2. Enter the write lock recursively from the read lock.
//    LockRecursionPolicy.NoRecursion:
//    
//    LockRecursionException: Write lock may not be acquired with read lock held. This pattern i
//    s prone to deadlocks. Please ensure that read locks are released before taking a write loc
//    k. If an upgrade is necessary, use an upgrade lock in place of the read lock.
//    LockRecursionPolicy.SupportsRecursion:
//    
//    LockRecursionException: Write lock may not be acquired with read lock held. This pattern i
//    s prone to deadlocks. Please ensure that read locks are released before taking a write loc
//    k. If an upgrade is necessary, use an upgrade lock in place of the read lock.

Açıklamalar

Varsayılan özyineleme ilkesi, kilidin türüne bağlıdır. Varsayılan ilke ve belirli bir kilit türü için kilit özyinelemesinin kesin davranışı için, türün belgelerine bakın. Örneğin sınıfı, ReaderWriterLockSlim kilitlenme olasılığını azaltmak için kilit ilkesi ayarından bağımsız olarak, okuma modunda kilit girdiyse, iş parçacığının yazma modunda kilidi girmesine izin vermez.

Şu anda yalnızca bir kilit bu numaralandırmayı kullanır:

Şunlara uygulanır

Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0