Kilit ifadesi, verilen bir nesnenin mutex'ini alır, bir ifade bloğunu çalıştırır ve ardından kilidi serbest bırakır. Kilidi tuttuğunda, kilidi tutan iplik kilidi tekrar alıp serbest bırakabilir. Diğer herhangi bir iş parçacağı kilitlenme konusunda engellenir ve kilidin açılmasını bekler.
Eleştiri:
Kilit kodunu kullanın
Eşdeğer
Lock'un temel kodunun Monitor tarafından uygulandığı düşünülebilir.
Kod deneme kullandığı için... final block, yani kilit ifadesinin gövdesine istisna atılırsa bile kilit serbest bırakılır.
Ifadenin gövdesinde await operatör kilidini kullanamazsınız.Bunu ifadenin gövdesinde kullanamazsınızbekleOperatör kilidi。 Ifadenin gövdesinde await operatör kilidini kullanamazsınız. Ifadenin gövdesinde await operatör kilidini kullanamazsınız. Bu cümle çok önemli!
Belge:Bağlantı girişi görünür.
Kodu kendim test ediyorum,Kilidi almak için Görev kullanın ve bloklamak için beklemeyi kullanın, kod şöyledir:
Aşağıdaki kod birkaç kez çalıştırıldıktan sonra, yürütme sonucu beklendiği gibi değildir.
Neden? Lock bloğunda await anahtar kelimesini kullanmaya çalışırsanız, bir lock ifadesinin gövdesinde şu derleme hatasını alırsınız: not await (not await). Bunun nedeni, await tamamlandıktan sonra, metodun await anahtar kelimesinden önceki thread (calling thread) yerine farklı bir iş başlığında çalışabilmesidir.lockkeywordAynı konuKilide kilitle ve serbest kilidi açın。 Nedeni daha sezgisel görmek için kodu değiştirin:
Kilidin diş kimliğini ve kilit açma cihazının diş id'sini alın,Tabii ki bir başlıkta değil, bu nedenle kilit başarılı bir şekilde açılamaz, aşağıdaki şekilde gösterilmiştir:
Kodu değiştirmeyi denedim, thread ile test ettim, defalarca çalıştırdım ve beklendiği gibi çalıştı, kod şu şekildedir:
(Son)
|