Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 193519|Odgovoriti: 11

[Vir] .net/c# Uporabniški večnitni zaklep sočasnosti (string){...} Podrobna razlaga

[Kopiraj povezavo]
Objavljeno na 3. 07. 2019 15:25:19 | | | |
Pogosti primeri zlorabe: Da bi preprečili podvajanje plačil naročil, ki jih povzročijo uporabniki, ki po nesreči večkrat kliknejo gumb za plačilo, uporabljamo zaklep (številko naročila), da zagotovimo, da je operacija na naročilu dovoljena le ena nit.

Ta ideja je dobra, vsaj boljša kot zaklepanje (zasebni statični objekt za obdelavo razredov), saj učinek zaklepanja števila naročil je, da zaklene le operacijo trenutnega 1 naročila, in če zaklene statično spremenljivko, torej zaklene vse ukaze, povzroči, da bodo vsi ukazi v vrsti, kar je očitno nerazumno.

Ali lahko metoda ključavnice (številka naročila), omenjena na začetku tega članka, doseže želeni učinek? Najprej uporabimo nekaj kode za obnovitev scenarija uporabe.

Če prezrete uporabniške informacije in druge potrditve, koda izgleda približno takole:
Za ključavnico MSDN vključuje informacije, ki jih je mogoče najti na Baidu, in zdi se, da se ne priporoča uporaba lock(string), razlog pa je enak. Naslednji odlomek je vzet iz MSDN-jevega nasveta o zaklepnih vrvicah:

Težava z zaklepanjem ("myLock") nastane, ker bo vsaka druga koda, ki uporablja isti niz v procesu, delila isto ključavnico.
Ta stavek skriva ogromen mehanizem, to je "isto vrvico".

Kaj je "ista struna"? Oglejte si kodo:


Ali sta str1 in str2 ista struna zgoraj? Odgovor je DA.

Glej še enkrat:


Ali sta str1 in str2 zgoraj še vedno ista struna? Odgovor je NE.

V redu, vrnimo se k vprašanju plačila naročila. V naši kodi, lock(orderNumber), ko uporabnik po nesreči klikne še nekajkrat po potegou roke, ali je orderNumber, ki vnaša to dejanje vsakič, isti niz? Odgovor je NE. To pomeni

Koda, ki upravlja zgornji vrstni red, dejansko ne deluje kot ključavnica.

Pravzaprav obstajata dve vrsti primerjav nizov, glej kodo:


Prva vrstica zgornje kode izpiše True, druga vrstica pa False. Verjamem, da razumeš, kaj MSDN pomeni z "istim nizom" brez moje razlage.

Najboljša rešitev

Rešitve za optimalne zaklepne vrvice:





Demo koda:




Na spletni strani se včasih uporabi globalna spremenljivka, ta globalna spremenljivka, ko več uporabnikov dostopa hkrati, lahko deluje nenavadno; takrat nastavimo globalno zaklepanje, vendar je slabost, da vsi dostopi čakajo zapored.

V nekaterih primerih, na primer, lahko isti uporabnik komentira le enkrat v 15 sekundah; če se uporabi globalno zaklepanje, bo funkcija komentarja zelo počasna pri obdelavi, ko se število uporabnikov poveča, kar močno vpliva na uporabniško izkušnjo.

V tem trenutku,Za vsakega uporabnika lahko nastavimo zaklep posebej, zaklep(niz){...}, ime ključavnice pa lahko definiramo kot:Ime metode + uporabniški IDNa ta način ima vsak uporabnik neodvisno zaklepanje, in pri ocenjevanju intervala komentarjev to ne vpliva na komentarje drugih uporabnikov.

(Konec)




Prejšnji:MFC-jevo pisanje za LPSTR
Naslednji:OpenSSL je očitno posodobljen, Apache še vedno pojavlja staro različico?
Objavljeno na 13. 05. 2022 14:27:17 |
Ali lahko metoda ključavnice (številka naročila), omenjena na začetku tega članka, doseže želeni učinek? Najprej uporabimo nekaj kode za obnovitev scenarija uporabe.
 Najemodajalec| Objavljeno na 12. 08. 2023 19:48:15 |
.NET/C# Lock Principle Monitor ponuja poglobljeno razlago
https://www.itsvse.com/thread-9633-1-1.html
Objavljeno na 7. 01. 2023 11:22:02 |
S tem sem se srečal tudi v svoji delovni praksi, hvala avtorju za ta strokovni članek
Objavljeno na 3. 07. 2019 20:02:32 |
To je dobra stvar
Objavljeno na 18. 06. 2021 14:24:43 |
Na strani je prikazano, da kode ni mogoče videti
Objavljeno na 29. 06. 2021 00:21:16 |
Poglej kodo
Objavljeno na 29. 06. 2021 00:54:24 |
Ne vidim kode
Objavljeno na 14. 05. 2022 10:06:46 |
Uči se učiti
Objavljeno na 28. 05. 2022 22:03:59 |
Zelo dobro, učeno
Objavljeno na 28. 11. 2022 21:46:47 |
Ali se asp.net lahko uporabi?
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com