Der Grund, warum die Verwendung von lock
innerhalb der await
-Anweisung in C#
In C# kann der await
-Operator nicht innerhalb einer lock
-Anweisung verwendet werden, da dies eine bewusste Entwurfsentscheidung des Compilerteams ist. Obwohl die Implementierung dieser Funktionalität nicht schwierig ist, gilt sie als gefährliche Praxis, die zu Deadlocks führen kann.
Der Grund für die Einschränkung
Das Erlauben der Verwendung von lock
innerhalb einer await
-Anweisung führt zur Ausführung von beliebigem Code zwischen dem Zeitpunkt, an dem await
die Kontrolle freigibt, und der anschließenden Wiederaufnahme der Methode. Dieser Code kann Sperren in einer Reihenfolge erwerben, die im Widerspruch zur ursprünglichen Sperrenhierarchie steht und einen Deadlock verursacht.
Darüber hinaus await
kann die Ausführung in einem anderen Thread als dem Thread fortgesetzt werden, der ursprünglich die Sperre erhalten hat. Dadurch besteht die Möglichkeit, dass die Sperre in einem anderen Thread aufgehoben wird als dem, der die Sperre erworben hat, was höchst unerwünscht ist.
Auswirkungen auf die Implementierung benutzerdefinierter Sperren
Versuche, diese Einschränkung mithilfe einer benutzerdefinierten Sperrimplementierung (wie der im angegebenen Codebeispiel bereitgestellten) zu umgehen, können zu unvorhersehbarem und möglicherweise Deadlock-anfälligem Verhalten führen. Dies liegt daran, dass der await
-Aufruf in der ExitDisposable
-Klasse möglicherweise auf unbestimmte Zeit blockiert, wenn ein anderer Thread die Sperre erhält, während der Monitor.Exit
-Vorgang ausgeführt wird.
Fazit
Während der await
-Operator leistungsstarke asynchrone Programmierfunktionen bereitstellt, ist es wichtig zu verstehen, wie wichtig es ist, empfohlene Best Practices zu befolgen, einschließlich des Verbots der Verwendung von lock
innerhalb einer await
-Anweisung. Diese Einschränkung soll Deadlocks verhindern und die Sicherheit und Zuverlässigkeit von Multithread-Code gewährleisten.
Das obige ist der detaillierte Inhalt vonWarum können Sie „await' nicht in einer „lock'-Anweisung in C# verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!