Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 193519|Antwoord: 11

[Bron] .net/c# Gebruiker multithreaded concurrency lock(string){...} Gedetailleerde uitleg

[Link kopiëren]
Geplaatst op 03-07-2019 15:25:19 | | | |
Veelvoorkomende misbruikscenario's: Om dubbele betaling van bestellingen te voorkomen, veroorzaakt door gebruikers die per ongeluk meerdere keren op de betaalknop klikken, gebruiken we lock (ordernummer) om ervoor te zorgen dat slechts één thread de bewerking op de order mag uitvoeren.

Dit idee is goed, in ieder geval beter dan lock (een privé statisch object voor het verwerken van klassen), omdat het effect van het lockordernummer is dat alleen de werking van de huidige 1 order wordt vergrendeld, en als een statische variabele lock alle orders bevat, zal het ervoor zorgen dat alle orders in de wachtrij worden gezet, wat uiteraard onredelijk is.

Kan de lock (ordernummer) methode die aan het begin van dit artikel wordt genoemd het gewenste effect bereiken? Laten we eerst wat code gebruiken om het gebruiksscenario te herstellen.

Als je gebruikersinformatie en andere validaties negeert, ziet de code er ongeveer zo uit:
Voor het slotsleutelwoord bevat MSDN informatie die op Baidu te vinden is, en het lijkt erop dat het wordt aanbevolen om geen lock (string) te gebruiken, en de reden is hetzelfde. De volgende passage is afkomstig uit het advies van MSDN over lockstrings:

Het lock("myLock")-probleem ontstaat omdat elke andere code die dezelfde string in het proces gebruikt, dezelfde lock deelt.
Deze zin verbergt een enorm mechanisme, namelijk "dezelfde string".

Wat is "dezelfde snaar"? Zie de code:


Zijn str1 en str2 dezelfde snaar hierboven? Het antwoord is JA.

Zie nog eens:


Zijn str1 en str2 hierboven nog steeds dezelfde snaar? Het antwoord is NEE.

Oké, laten we teruggaan naar de kwestie van de betaling van onze bestelling. In onze code, lock(orderNumber), wanneer de gebruiker per ongeluk nog een paar keer klikt na het vegen van zijn hand, is het orderNumber dat deze actie invoert elke keer dezelfde string? Het antwoord is NEE. Dit wil zeggen

De code die bovenstaande volgorde afhandelt, werkt eigenlijk niet als een slot.

Er zijn namelijk twee soorten stringvergelijkingen, zie de code:


De eerste regel van bovenstaande code geeft True uit, en de tweede regel geeft False uit. Ik geloof dat je begrijpt wat MSDN bedoelt met "dezelfde snaar" zonder mijn uitleg.

De beste oplossing

Oplossingen voor optimale locking strings:





Democode:




Op de website kan soms een globale variabele worden gebruikt; deze globale variabele kan abnormaal lijken wanneer meerdere gebruikers tegelijk toegang hebben; op dat moment stellen we een globale vergrendeling in, maar het nadeel hiervan is dat alle toegangswegen om de beurt wachten.

In sommige scenario's kan dezelfde gebruiker bijvoorbeeld slechts één keer binnen 15 seconden reageren; als de globale vergrendeling wordt gebruikt, zal de commentaarfunctie erg traag verwerken wanneer het aantal gebruikers stijgt, wat de gebruikerservaring sterk zal beïnvloeden.

Op dit moment,We kunnen het slot voor elke gebruiker afzonderlijk instellen, lock(string){...}, en de naam van het slot kan worden gedefinieerd als:Methodenaam + gebruikers-IDOp deze manier heeft elke gebruiker een onafhankelijke vergrendeling, en bij het beoordelen van het reactie-interval beïnvloedt dit de reacties van andere gebruikers niet.

(Einde)




Vorig:MFC's LPSTR-typeschrift
Volgend:OpenSSL is duidelijk bijgewerkt, Apache geeft nog steeds de oude versie aan?
Geplaatst op 13-05-2022 14:27:17 |
Kan de lock (ordernummer) methode die aan het begin van dit artikel wordt genoemd het gewenste effect bereiken? Laten we eerst wat code gebruiken om het gebruiksscenario te herstellen.
 Huisbaas| Geplaatst op 12-08-2023 19:48:15 |
.NET/C# Lock Principle Monitor biedt een diepgaande uitleg
https://www.itsvse.com/thread-9633-1-1.html
Geplaatst op 07-01-2023 11:22:02 |
Ik ben het ook tegengekomen in mijn werkpraktijk, dankzij de auteur van dit technische artikel
Geplaatst op 03-07-2019 20:02:32 |
Dit is goed spul
Geplaatst op 18-06-2021 14:24:43 |
Wat op de pagina wordt getoond, is dat de code niet bekeken kan worden
Geplaatst op 29-06-2021 00:21:16 |
Kijk naar de code
Geplaatst op 29-06-2021 00:54:24 |
Ik kan de code niet zien
Geplaatst op 14-05-2022 10:06:46 |
Leer leren
Geplaatst op 28-05-2022 22:03:59 |
Heel goed, geleerd
Geplaatst op 28-11-2022 21:46:47 |
Kan asp.net gebruikt worden?
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com