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

Ansehen: 49134|Antwort: 4

[Quelle] .NET/C# Lock Principle Monitor bietet eine ausführliche Erklärung

[Link kopieren]
Veröffentlicht am 29.04.2021 09:54:10 | | | |
Die Lock-Anweisung nimmt das Mutex eines gegebenen Objekts, führt einen Statement-Block aus und löst dann das Lock. Wenn ein Schloss gehalten wird, kann das Gewinde, das das Schloss hält, das Schloss aufnehmen und wieder öffnen. Jeder andere Thread wird daran gehindert, das Schloss zu bekommen, und wartet, bis das Schloss freigegeben wird.

Rezension:

.net/c# Benutzer-multithreaded Nebenlaufbahn-Lock(string){...} Detaillierte Erklärung
https://www.itsvse.com/thread-7764-1-1.html

Verwenden Sie den Sperrcode

Äquivalent zu

Man kann annehmen, dass der zugrundeliegende Code von Lock von Monitor implementiert wird.

Da der Code versucht... Finalblock, also selbst wenn eine Ausnahme im Körper der Lock-Quote verwendet wird, wird die Lock freigegeben.

Du kannst die Await-Operator-Sperre im Hauptteil der Anweisung nicht verwenden.Sie dürfen es nicht im Hauptteil der Aussage verwendenWarteBedienerschloss。 Du kannst die Await-Operator-Sperre im Hauptteil der Anweisung nicht verwenden. Du kannst die Await-Operator-Sperre im Hauptteil der Anweisung nicht verwenden. Dieser Satz ist sehr wichtig!

Dokumentation:Der Hyperlink-Login ist sichtbar.

Ich teste den Code selbst,Benutze Aufgabe, um die Sperre zu bekommen, und nutze abwarten, um zu blockieren., der Code lautet wie folgt:

Nach mehrfacher Ausführung des folgenden Codes ist das Ausführungsergebnis nicht wie erwartet.



Warum? Wenn Sie versuchen, das await-Schlüsselwort zu verwenden, wenn Sie versuchen, das await-Schlüsselwort im Lock-Block zu verwenden, erhalten Sie diesen Kompilierungsfehler: cannot await im Hauptteil einer lock-Anweisung. Der Grund ist, dass nach Abschluss von await die Methode in einem anderen Thread ausgeführt werden kann, anstatt im Thread (der den Thread aufruft) vor dem await-Keyword.lockkeywordGleicher FadenVerriegelung und Loslösung im Schloss
Ändern Sie den Code, um den Grund intuitiver zu erkennen:

Holen Sie sich die Gewinde-ID des Schlosses und die Gewinde-ID des Schlosslöser-Lösers,Offensichtlich nicht in einem Thread, sodass die Verriegelung nicht erfolgreich aufgehoben werden kann, wie in der untenstehenden Abbildung gezeigt:



Ich habe versucht, den Code zu ändern, mit Thread getestet, mehrfach ausgeführt, und es hat wie erwartet funktioniert, der Code ist wie folgt:



(Ende)





Vorhergehend:(to).NET/C#, um den Ordner in eine Zip-Datei zu packen.
Nächster:Redis verwendet Lua-Skripte für detaillierte Erklärungen
 Vermieter| Veröffentlicht am 10.02.2022 09:20:09 |

Öffne das Schloss nicht





 Vermieter| Veröffentlicht am 25.06.2023 19:57:43 |
Die Objektsynchronisationsmethode wurde aus einem unsynchronisierten Codeblock aufgerufen.
Der folgende Code liefert einen obigen Fehler




 Vermieter| Veröffentlicht am 12.08.2023 19:47:49 |
Lock-Syntax-Zucker, wie unten gezeigt:






 Vermieter| Veröffentlicht am 11.07.2024 10:44:02 |
【Turn】C# Multithreaded Nebenläufigkeit unter verschiedenen Sperren
https://www.itsvse.com/thread-10561-1-1.html
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