Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 193519|Antwort: 11

[Quelle] .net/c# Benutzer-multithreaded Nebenlaufbahn-Lock(string){...} Detaillierte Erklärung

[Link kopieren]
Veröffentlicht am 03.07.2019 15:25:19 | | | |
Häufige Missbrauchsszenarien: Um doppelte Zahlungen von Bestellungen zu verhindern, die durch mehrfaches Drücken der Zahlungstaste verursacht werden, verwenden wir Lock (Bestellnummer), um sicherzustellen, dass nur ein Thread die Operation an der Bestellung ausführen darf.

Diese Idee ist gut, zumindest besser als Lock (ein privates statisches Objekt zur Verarbeitung von Klassen), denn die Wirkung der Locking-Ordernummer besteht darin, nur die Operation der aktuellen 1-Ordnung zu sperren, und wenn eine statische Variable, also alle Aufträge blockiert, werden alle Bestellungen in die Warteschlange gestellt, was offensichtlich unzumutbar ist.

Kann also die am Anfang dieses Artikels erwähnte Lock-(Ordernummer-)Methode den gewünschten Effekt erzielen? Lass uns zuerst etwas Code verwenden, um das Nutzungsszenario wiederherzustellen.

Wenn man Benutzerinformationen und andere Validierungen ignoriert, sieht der Code ungefähr so aus:
Für das Schlüsselwort Lock enthält MSDN Informationen, die auf Baidu zu finden sind, und es scheint, dass empfohlen wird, Lock (String) nicht zu verwenden, und der Grund ist derselbe. Die folgende Passage stammt aus MSDNs Rat zu Lockstrings:

Das Lock("myLock")-Problem tritt auf, weil jeder andere Code, der denselben String im Prozess verwendet, dasselbe Schloss teilt.
Dieser Satz verbirgt einen riesigen Mechanismus, nämlich "denselben String".

Was ist "die gleiche Saite"? Siehe den Code:


Sind Str1 und Str2 dieselbe Saite oben genannt? Die Antwort lautet JA.

Siehe nochmal:


Sind Str1 und Str2 oben immer noch dieselbe Saite? Die Antwort lautet NEIN.

Okay, kommen wir zurück zum Thema unserer Bestellzahlung. In unserem Code, lock(orderNumber), wenn der Benutzer nach dem Wischen seiner Hand versehentlich noch ein paar Mal klickt, ist die OrderNumber dann jedes Mal dieselbe Zeichenkette, die diese Aktion eingibt? Die Antwort lautet NEIN. Das heißt,

Der Code, der die obige Reihenfolge abwickelt, wirkt tatsächlich nicht als Sperre.

Tatsächlich gibt es zwei Arten von String-Vergleichen, siehe den Code:


Die erste Zeile des obigen Codes gibt True aus, und die zweite Zeile gibt False aus. Ich glaube, du verstehst, was MSDN mit "derselben String" meint, ohne meine Erklärung.

Die beste Lösung

Lösungen für optimale Locking Strings:





Demo-Code:




Auf der Website kann manchmal eine globale Variable verwendet werden; diese globale Variable kann abnormal erscheinen, wenn mehrere Benutzer gleichzeitig zugreifen; zu diesem Zeitpunkt setzen wir eine globale Sperre, aber der Nachteil ist, dass alle Zugriffe nacheinander warten.

In manchen Szenarien kann derselbe Nutzer beispielsweise nur innerhalb von 15 Sekunden kommentieren; wenn die globale Sperre verwendet wird, wird die Kommentarfunktion sehr langsam verarbeitet, wenn die Nutzerzahl stark steigt, was das Nutzererlebnis stark beeinflusst.

Zu dieser Zeit,Wir können das Schloss für jeden Benutzer einzeln festlegen, lock(string){...}, und der Name des Schlosses kann definiert werden als:Methodenname + Benutzer-IDAuf diese Weise hat jeder Nutzer eine unabhängige Sperre, und wenn man das Kommentarintervall beurteilt, wirkt sich das nicht auf die Kommentare anderer Nutzer aus.

(Ende)




Vorhergehend:MFCs LPSTR-Schrift
Nächster:OpenSSL wurde offensichtlich aktualisiert, Apache fordert immer noch die alte Version auf?
Veröffentlicht am 13.05.2022 14:27:17 |
Kann also die am Anfang dieses Artikels erwähnte Lock-(Ordernummer-)Methode den gewünschten Effekt erzielen? Lass uns zuerst etwas Code verwenden, um das Nutzungsszenario wiederherzustellen.
 Vermieter| Veröffentlicht am 12.08.2023 19:48:15 |
.NET/C# Lock Principle Monitor bietet eine ausführliche Erklärung
https://www.itsvse.com/thread-9633-1-1.html
Veröffentlicht am 07.01.2023 11:22:02 |
Ich bin ihr auch in meiner Arbeitspraxis begegnet, dank des Autors dieses technischen Artikels
Veröffentlicht am 03.07.2019 20:02:32 |
Das ist gutes Zeug
Veröffentlicht am 18.06.2021 14:24:43 |
Was auf der Seite angezeigt wird, ist, dass der Code nicht angezeigt werden kann
Veröffentlicht am 29.06.2021 00:21:16 |
Schau dir den Code an
Veröffentlicht am 29.06.2021 00:54:24 |
Ich kann den Code nicht sehen
Veröffentlicht am 14.05.2022 10:06:46 |
Lernen lernen
Veröffentlicht am 28.05.2022 22:03:59 |
Sehr gut, gelernt
Veröffentlicht am 28.11.2022 21:46:47 |
Kann asp.net verwendet werden?
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com