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

Görünüm: 193519|Yanıt: 11

[Kaynak] .net/c# Kullanıcı çoklu iş parçacıklı eşzamanlılık lock(string){...} Detaylı açıklama

[Bağlantıyı kopyala]
Yayınlandı 3.07.2019 15:25:19 | | | |
Yaygın yanlış kullanım senaryoları: Kullanıcıların ödeme düğmesine yanlışlıkla birden fazla tıklaması nedeniyle siparişlerin tekrarlanan ödemelerini önlemek için, sipariş üzerinde işlemi yalnızca bir iş parçacığına yapmasına izin verilmesini sağlamak için kilitleme (sipariş numarası) kullanıyoruz.

Bu fikir iyidir, en azından sınıfları işlemek için özel statik bir nesne olan lock'dan daha iyidir, çünkü emir numarasını kilitlemenin etkisi sadece mevcut 1 siparişin işlemini kilitlemektir ve eğer statik değişkeni kilitlemek, yani tüm emirleri kilitlemek durumunda, tüm emirlerin sıraya girmesine neden olur ki bu açıkça mantıksızdır.

Peki, bu makalenin başında bahsedilen kilit (sipariş numarası) yöntemi istenen etkiyi elde edebilir mi? Önce kullanım senaryosunu geri yüklemek için biraz kod kullanalım.

Kullanıcı bilgilerini ve diğer doğrulamaları görmezden gelirseniz, kod neredeyse şöyle görünür:
Kilit anahtar kelimesi için MSDN, Baidu'da bulunabilen bilgileri içerir ve lock(string) kullanmamanın tavsiye edildiği anlaşılıyor, sebep aynı. Aşağıdaki bölüm, MSDN'nin kilitli iplerle ilgili tavsiyesinden alınmıştır:

Lock("myLock") sorunu, aynı diziyi kullanan diğer kodların aynı kilidi paylaşması nedeniyle ortaya çıkar.
Bu cümle büyük bir mekanizmayı gizler, yani "aynı ip".

"Aynı ip" nedir? Koda bakınız:


Str1 ve str2 yukarıdaki aynı tel mi? Cevap EVET.

Tekrar bakınız:


Str1 ve str2 yukarıdaki hâlâ aynı tel mi? Cevap HAYIR.

Tamam, sipariş ödememiz meselesine geri dönelim. Kodumuzda, lock(orderNumber), kullanıcı elini kaydırdıktan sonra yanlışlıkla birkaç kez daha tıkladığında, bu eylemi giren orderNumber her seferinde aynı dizi mi? Cevap HAYIR. Yani

Yukarıdaki siparişi yöneten kod aslında kilit olarak işlemez.

Aslında, iki tür dizi karşılaştırması vardır, koda bakınız:


Yukarıdaki kodun ilk satırı Doğru, ikinci satır ise Yanlış çıktısını verir. MSDN'nin "aynı ip" dediğiyle ne demek istediğini benim açıklamam olmadan anladığınıza inanıyorum.

En iyi çözüm

Optimal kilitleme iplikleri için çözümler:





Demo kodu:




Web sitesinde bazen küresel bir değişken kullanılabilir, bu küresel değişken, birden fazla kullanıcı aynı anda eriştiğinde anormal görünebilir, bu zaman küresel bir kilitleme kuracağız, ancak dezavantajı tüm erişimlerin sırayla beklemesidir.

Örneğin, bazı durumlarda, aynı kullanıcı yalnızca 15 saniye içinde bir kez yorum yapabilir; küresel kilit kullanılırsa, kullanıcı sayısı arttığında yorum fonksiyonu çok yavaş işlemeye başlayacak ve bu da kullanıcı deneyimini büyük ölçüde etkiler.

Şu anda,Her kullanıcı için kilidi ayrı ayrı ayarlayabiliriz, lock(string){...} ve kilidin adı şu şekilde tanımlanabilir:Metet adı + kullanıcı kimliğiBu şekilde, her kullanıcının bağımsız bir kilidi olur ve yorum aralığı değerlendirildiğinde diğer kullanıcıların yorumlarını etkilemez.

(Son)




Önceki:MFC'nin LPSTR yazı yazısı
Önümüzdeki:OpenSSL açıkça güncellendi, Apache hâlâ eski sürümü soruyor mu?
Yayınlandı 13.05.2022 14:27:17 |
Peki, bu makalenin başında bahsedilen kilit (sipariş numarası) yöntemi istenen etkiyi elde edebilir mi? Önce kullanım senaryosunu geri yüklemek için biraz kod kullanalım.
 Ev sahibi| Yayınlandı 12.08.2023 19:48:15 |
.NET/C# Kilit Prensip Monitörü derinlemesine bir açıklama sunar
https://www.itsvse.com/thread-9633-1-1.html
Yayınlandı 7.01.2023 11:22:02 |
Ben de bu teknik makalenin yazarı sayesinde iş pratiğimde de karşılaştım
Yayınlandı 3.07.2019 20:02:32 |
Bu iyi şeyler
Yayınlandı 18.06.2021 14:24:43 |
Sayfada gösterilen, kodun görüntülenemediği
Yayınlandı 29.06.2021 00:21:16 |
Koda bak
Yayınlandı 29.06.2021 00:54:24 |
Kodu göremiyorum
Yayınlandı 14.05.2022 10:06:46 |
Öğrenmeyi öğren
Yayınlandı 28.05.2022 22:03:59 |
Çok iyi, öğrendim
Yayınlandı 28.11.2022 21:46:47 |
asp.net kullanılabilir mi?
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