Heim > Backend-Entwicklung > C++ > Warum können Sie „await' nicht in einer „lock'-Anweisung in C# verwenden?

Warum können Sie „await' nicht in einer „lock'-Anweisung in C# verwenden?

Mary-Kate Olsen
Freigeben: 2025-01-15 11:12:45
Original
377 Leute haben es durchsucht

Why Can't You Use `await` Inside a `lock` Statement in C#?

Der Grund, warum die Verwendung von lock innerhalb der await-Anweisung in C#

verboten ist

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage