Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 49134|Yanıt: 4

[Kaynak] .NET/C# Kilit Prensip Monitörü derinlemesine bir açıklama sunar

[Bağlantıyı kopyala]
Yayınlandı 29.04.2021 09:54:10 | | | |
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:

.net/c# Kullanıcı çoklu iş parçacıklı eşzamanlılık lock(string){...} Detaylı açıklama
https://www.itsvse.com/thread-7764-1-1.html

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)





Önceki:(to).NET/C# ile klasörü zip dosyasına paketlemek için
Önümüzdeki:Redis, ayrıntılı açıklamalar için Lua betanlarını kullanır
 Ev sahibi| Yayınlandı 10.02.2022 09:20:09 |

Kilidi açma





 Ev sahibi| Yayınlandı 25.06.2023 19:57:43 |
Nesne senkronizasyon yöntemi, senkronize edilmemiş bir kod bloğundan çağrılmıştır.
Aşağıdaki kod yukarıdaki hata verecektir




 Ev sahibi| Yayınlandı 12.08.2023 19:47:49 |
Aşağıda gösterildiği gibi Lock sözdizimi sugar:






 Ev sahibi| Yayınlandı 11.07.2024 10:44:02 |
【Turn】C# çeşitli kilitler altında çok iş parçacıklı eşzamanlılık
https://www.itsvse.com/thread-10561-1-1.html
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com