Sobes.tech
Middle+

Ի՞նչ կառուցվածքի մեջ է փոխարկվում lock օպերատորը C#-ում։

sobes.tech AI

Պատասխան AI-ից

C#-ի lock օպերատորը փոխարկվում է Monitor.Enter և Monitor.Exit մեթոդների կանչերին (կամ Monitor.TryEnter-ին Monitor.Exit-ի հետ միասին) try...finally բլոկում:

// Միգուցե սկզբնական կոդը lock-ով
object lockObject = new object();
lock (lockObject)
{
    // Ապահովված կոդ
}

// Փոխարկումը մոտավորապես հետևյալն է.
object lockObject = new object();
bool lockTaken = false; // դրոշ՝ հետևելու համար, արդյոք մոնիտորը ձեռք է բերվել
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Փորձել մոնիտորը ձեռք բերել
    // Կարող եք օգտագործել `Monitor.TryEnter`-ը `Monitor.Enter`-ի փոխարեն
    if (lockTaken) // Ստուգում է, արդյոք մոնիտորը ձեռք է բերվել
    {
        // Ապահովված կոդ
    }
}
finally
{
    if (lockTaken) // Մոնիտորը ազատվում է միայն եթե այն ձեռք է բերվել
    {
        Monitor.Exit(lockObject);
    }
}

Monitor.Enter-ի օգտագործումը ref bool lockTaken պարամետրի հետ և try...finally բլոկը ապահովում է, որ մոնիտորը ազատվի նույնիսկ եթե տեղի ունենա արտահայտություն պաշտպանվող կոդում։