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:
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)
|