Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 193519|Válasz: 11

[Forrás] .net/c# User multithreaded concurrency lock(string){...} Részletes magyarázat

[Linket másol]
Közzétéve 2019. 07. 03. 15:25:19 | | | |
Gyakori visszaélési esetek: Annak érdekében, hogy megakadályozzuk a rendelések duplikált kifizetését, amelyet a felhasználók véletlenül többször is megnyomnak a fizetési gombra, lock (rendelésszám) segítségével biztosítjuk, hogy csak egy szál hajtsa végre a műveletet a rendelésen.

Ez az ötlet jó, legalábbis jobb, mint a lock (egy privát statikus objektum az osztályok feldolgozásához), mert a rendelésszám zárolása csak az aktuális 1 rend műveletét zárja, és ha a statikus változó zárolása, vagyis az összes rendelés zárolása, akkor minden rendelés sorba kerül, ami nyilvánvalóan ésszerűtlen.

Tehát a cikk elején említett zárolási (rendelésszám) módszer elérheti-e a kívánt hatást? Használjunk először egy kis kódot a használati helyzet visszaállításához.

Ha figyelmen kívül hagyod a felhasználói információkat és egyéb ellenőrzéseket, a kód nagyjából így néz ki:
A zár kulcsszó esetén az MSDN olyan információkat tartalmaz, amelyek a Baidu-n találhatók, és úgy tűnik, hogy ajánlott nem használni a lock(string) kifejezést, az ok pedig ugyanaz. A következő rész az MSDN zárhúrokkal kapcsolatos tanácsából származik:

A lock("myLock") probléma azért alakul ki, mert bármely más kód, amely ugyanazt a stringet használja a folyamatban, ugyanazt a zárat osztja meg.
Ez a mondat egy hatalmas mechanizmust rejt, vagyis "ugyanazt a zsinórt".

Mi az a "ugyanaz a húr"? Lásd a kódot:


Az 1. és 2. és a 2. húr ugyanaz a felsőbb szereplő? A válasz IGEN.

Lásd újra:


Az 1. és 2. szúró fölött még mindig ugyanaz a húr? A válasz: NEM.

Rendben, térjünk vissza a rendelés kifizetésének kérdéséhez. A mi kódunkban, a lock(orderNumber), amikor a felhasználó véletlenül még néhányszor kattint a keze húzása után, vajon a orderNumber minden alkalommal ugyanazt a stringet írja? A válasz: NEM. Ez azt jelenti, hogy

A fenti sorrendet kezelő kód valójában nem működik zárként.

Valójában kétféle string-összehasonlítás létezik, lásd a kódot:


A fenti kód első sora True-t, a második sor pedig False-t ad. Úgy hiszem, érted, mit ért az MSDN az "ugyanazzal a zsinórral" anélkül, hogy magyaráztam volna.

A legjobb megoldás

Optimális zároló húrok megoldásai:





Demográfiai kód:




A weboldalon néha globális változót is használnak, ez a globális változó, amikor több felhasználó egyszerre ér hozzáférést, rendellenesnek tűnhet, ekkor globális zárolást állítunk be, de ennek hátránya, hogy minden hozzáférés sorra vár.

Bizonyos helyzetekben, például ugyanaz a felhasználó csak egyszer tud kommentelni 15 másodpercen belül, ha a globális zárolást használják, a komment funkció nagyon lassan feldolgozza, amikor a felhasználók száma megugrik, ami jelentősen befolyásolja a felhasználói élményt.

Ebben az időszakban,A zárat minden felhasználónak külön-külön állíthatjuk be, lock(string){...}, és a zár neve így definiálható:Metót név + felhasználói azonosítóÍgy minden felhasználónak független zárolása van, és a hozzászólásintervallum értékelése nem befolyásolja más felhasználók hozzászólásait.

(Vége)




Előző:Az MFC LPSTR betűs írása
Következő:Az OpenSSL nyilván frissítve lett, az APACHE még mindig a régi verziót hívja?
Közzétéve 2022. 05. 13. 14:27:17 |
Tehát a cikk elején említett zárolási (rendelésszám) módszer elérheti-e a kívánt hatást? Használjunk először egy kis kódot a használati helyzet visszaállításához.
 Háziúr| Közzétéve 2023. 08. 12. 19:48:15 |
A .NET/C# Lock Principle Monitor részletes magyarázatot nyújt
https://www.itsvse.com/thread-9633-1-1.html
Közzétéve 2023. 01. 07. 11:22:02 |
A munkagyakorlatomban is találkoztam vele, köszönet a szerzőnek ezért a technikai cikkért
Közzétéve 2019. 07. 03. 20:02:32 |
Ez jó cucc
Közzétéve 2021. 06. 18. 14:24:43 |
Az oldalon látható, hogy a kód nem tekinthető meg
Közzétéve 2021. 06. 29. 0:21:16 |
Nézd meg a kódot
Közzétéve 2021. 06. 29. 0:54:24 |
Nem látom a kódot
Közzétéve 2022. 05. 14. 10:06:46 |
Tanulj meg
Közzétéve 2022. 05. 28. 22:03:59 |
Nagyon jó, tanultam
Közzétéve 2022. 11. 28. 21:46:47 |
Használható asp.net?
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com