Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 193519|Răspunde: 11

[Sursă] .net/c# Lock(string) de concurență multithreaded de utilizator {...} Explicație detaliată

[Copiază linkul]
Postat pe 03.07.2019 15:25:19 | | | |
Scenarii frecvente de abuz: Pentru a preveni plata duplicată a comenzilor cauzată de faptul că utilizatorii au apăsat accidental butonul de plată de mai multe ori, folosim blocarea (numărul comenzii) pentru a ne asigura că doar un fir de discuție are voie să efectueze operațiunea pe comandă.

Această idee este bună, cel puțin mai bună decât lock-ul (un obiect static privat pentru procesarea claselor), deoarece efectul numărului de ordine de blocare este să blocheze doar operațiunea ordinului curent 1, iar dacă variabila statică blochează, adică blochează toate ordinele, va determina ca toate ordinele să fie puse la coadă, ceea ce este evident nerezonabil.

Deci, poate metoda încuietoare (numărul de comandă) menționată la începutul acestui articol să obțină efectul dorit? Hai să folosim niște cod pentru a restaura mai întâi scenariul de utilizare.

Dacă ignori informațiile utilizatorului și alte validări, codul arată cam așa:
Pentru cuvântul cheie al lacătului, MSDN include informații care pot fi găsite pe Baidu, iar se pare că se recomandă să nu se folosească lock(string), motivul fiind același. Următorul pasaj este preluat din sfaturile MSDN despre șirurile de încuietoare:

Problema lock("myLock") apare pentru că orice alt cod care folosește același șir în proces va împărți aceeași blocare.
Această propoziție ascunde un mecanism uriaș, și anume "același fir".

Ce este "aceeași coardă"? Vezi codul:


Str1 și str2 sunt același string de mai sus? Răspunsul este DA.

Vezi din nou:


St1 și str2 de deasupra sunt încă aceeași coardă? Răspunsul este NU.

Bine, să revenim la problema plății comenzii. În codul nostru, lock(orderNumber), când utilizatorul dă click din greșeală de câteva ori după ce își trece mâna, orderNumber introduce această acțiune este același șir de fiecare dată? Răspunsul este NU. Adică

Codul care gestionează comanda de mai sus nu acționează de fapt ca un blocat.

De fapt, există două tipuri de comparații de șiruri, vezi codul:


Prima linie a codului de mai sus afișează True, iar a doua linie produce False. Cred că înțelegi ce înseamnă MSDN prin "același șir" fără explicația mea.

Cea mai bună soluție

Soluții pentru șiruri de blocare optime:





Cod demo:




Pe site, uneori poate fi folosită o variabilă globală, această variabilă globală, când mai mulți utilizatori accesează simultan, poate părea anormală; în acest moment, vom seta un blocaj global, dar dezavantajul este că toate accesurile vor aștepta pe rând.

În unele situații, de exemplu, același utilizator poate comenta o singură dată în 15 secunde; dacă se folosește blocarea globală, funcția de comentarii va fi foarte lentă în procesare atunci când numărul de utilizatori crește, ceea ce va afecta semnificativ experiența utilizatorului.

În acest moment,Putem seta blocajul pentru fiecare utilizator individual, lock(string){...}, iar numele blocajului poate fi definit astfel:Numele metodei + ID-ul utilizatoruluiAstfel, fiecare utilizator are un blocaj independent, iar la evaluarea intervalului de comentarii, acesta nu va afecta comentariile celorlalți utilizatori.

(Sfârșit)




Precedent:Scrierea LPSTR a MFC
Următor:OpenSSL a fost evident actualizat, Apache încă solicită versiunea veche?
Postat pe 13.05.2022 14:27:17 |
Deci, poate metoda încuietoare (numărul de comandă) menționată la începutul acestui articol să obțină efectul dorit? Hai să folosim niște cod pentru a restaura mai întâi scenariul de utilizare.
 Proprietarul| Postat pe 12.08.2023 19:48:15 |
.NET/C# Monitor de principiu de blocare oferă o explicație detaliată
https://www.itsvse.com/thread-9633-1-1.html
Postat pe 07.01.2023 11:22:02 |
Am întâlnit-o și în practica mea profesională, mulțumită autorului pentru acest articol tehnic
Postat pe 03.07.2019 20:02:32 |
Asta e material bun
Postat pe 18.06.2021 14:24:43 |
Ceea ce este arătat pe pagină este că codul nu poate fi vizualizat
Postat pe 29.06.2021 00:21:16 |
Uită-te la cod
Postat pe 29.06.2021 00:54:24 |
Nu văd codul
Postat pe 14.05.2022 10:06:46 |
Învață să înveți
Postat pe 28.05.2022 22:03:59 |
Foarte bine, am învățat
Postat pe 28.11.2022 21:46:47 |
Se poate asp.net folosit?
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com