Bagikan melalui


Lock Kelas

Definisi

Catatan

Untuk menggunakan API pratinjau ini, Anda harus mengaktifkan fitur pratinjau di proyek dengan mengatur properti ke EnablePreviewFeaturesTrue dalam file proyek Anda. Untuk informasi selengkapnya, lihat https://aka.ms/dotnet-preview-features .

Menyediakan mekanisme untuk mencapai pengecualian bersama di wilayah kode antara utas yang berbeda.

public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
Warisan
Lock
Atribut

Keterangan

Kelas Lock dapat digunakan untuk menentukan wilayah kode yang memerlukan akses yang saling eksklusif antara utas proses, yang biasa disebut bagian penting, untuk mencegah akses bersamaan ke sumber daya. Lock dapat dimasukkan dan keluar, di mana wilayah kode antara masuk dan keluar adalah bagian penting yang terkait dengan kunci. Utas yang memasukkan kunci dikatakan menahan atau memiliki kunci sampai keluar dari kunci. Paling banyak satu utas dapat menahan kunci pada waktu tertentu. Utas dapat menahan beberapa kunci. Utas dapat memasukkan kunci beberapa kali sebelum keluar, seperti secara rekursif. Utas yang tidak dapat segera memasukkan kunci dapat menunggu hingga kunci dapat dimasukkan atau hingga batas waktu yang ditentukan kedaluwarsa.

Saat menggunakan Enter metode atau TryEnter untuk memasukkan kunci:

  • Pastikan bahwa utas keluar dari Exit kunci bahkan jika terjadi pengecualian, seperti di C# dengan menggunakan try/finally blok.
  • Ketika kunci sedang dimasukkan dan keluar dalam metode C# async , pastikan bahwa tidak await ada antara masuk dan keluar. Kunci dipegang oleh utas dan kode setelah await mungkin berjalan pada utas yang berbeda.

Disarankan untuk menggunakan EnterScope metode dengan konstruksi bahasa yang secara otomatis membuang yang dikembalikan Lock.Scope seperti kata kunci C using #, atau untuk menggunakan kata kunci C lock #, karena ini memastikan bahwa kunci keluar dalam kasus yang luar biasa. Pola-pola ini mungkin juga memiliki manfaat performa daripada menggunakan Enter/TryEnter dan Exit. Fragmen kode berikut mengilustrasikan berbagai pola untuk memasukkan dan keluar dari kunci.

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(); }
        }
    }
}

Saat menggunakan kata kunci C# lock atau mirip dengan memasukkan dan keluar dari kunci, jenis ekspresi harus tepat System.Threading.Lock. Jika jenis ekspresi adalah hal lain, seperti Object atau jenis generik seperti T, implementasi berbeda yang tidak dapat dipertukarkan dapat digunakan sebagai gantinya (seperti Monitor). Untuk informasi selengkapnya, lihat speklet pengkompilasi yang relevan.

Interrupt dapat mengganggu utas yang menunggu untuk memasukkan kunci. Pada utas WINDOWS STA, menunggu kunci memungkinkan pemompaan pesan yang dapat menjalankan kode lain pada utas yang sama selama menunggu. Beberapa fitur tunggu dapat ditimpa oleh kustom SynchronizationContext.

Catatan

Utas yang memasukkan kunci, termasuk beberapa kali seperti secara rekursif, harus keluar dari kunci berapa kali yang sama untuk sepenuhnya keluar dari kunci dan memungkinkan utas lain memasuki kunci. Jika utas keluar saat memegang Lock, perilaku Lock menjadi tidak terdefinisi.

Perhatian

Jika, pada jalur kode, utas mungkin memasukkan beberapa kunci sebelum keluar, pastikan bahwa semua jalur kode yang mungkin memasukkan dua kunci tersebut pada utas yang sama memasukkannya dalam urutan yang sama. Jika tidak, itu bisa menyebabkan kebuntuan. Misalnya, pertimbangkan bahwa pada satu alur T1 jalur kode masukkan kunci L1 lalu kunci L2 sebelum keluar dari keduanya, dan pada utas T2 jalur kode lain memasukkan kedua kunci dalam urutan terbalik. Dalam skenario itu, dimungkinkan untuk terjadinya urutan peristiwa berikut: memasukkan , memasukkan , mencoba memasukkan L2 dan menunggu, T2 mencoba memasukkan L1 dan menunggu. T1L2T2L1T1 Ada kebuntuan antara T1 dan T2 yang tidak dapat diselesaikan, dan utas lain yang mencoba memasukkan salah satu kunci di masa depan juga akan menggantung.

Konstruktor

Lock()

Menginisialisasi instans baru kelas Lock.

Properti

IsHeldByCurrentThread

Mendapatkan nilai yang menunjukkan apakah kunci dipegang oleh utas saat ini.

Metode

Enter()

Memasukkan kunci, menunggu jika perlu sampai kunci dapat dimasukkan.

EnterScope()

Memasukkan kunci, menunggu jika perlu sampai kunci dapat dimasukkan.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
Exit()

Keluar dari kunci.

GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetType()

Mendapatkan dari instans Type saat ini.

(Diperoleh dari Object)
MemberwiseClone()

Membuat salinan dangkal dari saat ini Object.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)
TryEnter()

Mencoba memasukkan kunci tanpa menunggu.

TryEnter(Int32)

Mencoba memasukkan kunci, menunggu jika perlu untuk jumlah milidetik yang ditentukan hingga kunci dapat dimasukkan.

TryEnter(TimeSpan)

Mencoba memasukkan kunci, menunggu jika perlu sampai kunci dapat dimasukkan atau sampai batas waktu yang ditentukan kedaluwarsa.

Berlaku untuk