Heim >Backend-Entwicklung >C++ >Warum ist „await' in einer „lock'-Anweisung in C# verboten?

Warum ist „await' in einer „lock'-Anweisung in C# verboten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-15 06:43:44394Durchsuche

Why is `await` Prohibited Inside a `lock` Statement in C#?

Die Einschränkung verstehen: await und lock in C#

Das Schlüsselwort await von C# ist für die asynchrone Programmierung von entscheidender Bedeutung und ermöglicht nicht blockierende Vorgänge. Die Verwendung von await innerhalb einer lock-Anweisung ist jedoch strengstens untersagt. Diese Einschränkung ist eine wichtige Entwurfsentscheidung, um eine häufige Fehlerquelle zu verhindern: Deadlocks.

In der Dokumentation von Microsoft wird erläutert, dass ein await-Ausdruck innerhalb eines lock ein Risiko darstellt. Die Ausführung des Codes kann angehalten werden, nachdem await die Kontrolle abgegeben hat, und später in einem möglicherweise anderen Thread fortgesetzt werden. Diese Zeitlücke kann dazu führen, dass andere Threads Sperren erhalten, die Sperrreihenfolge umgekehrt wird und es zu einem Deadlock kommt.

Lassen Sie uns ein hypothetisches Beispiel untersuchen:

<code class="language-csharp">class Async
{
    public static async Task<IDisposable> Lock(object obj)
    {
        while (!Monitor.TryEnter(obj))
            await Task.Yield();

        return new ExitDisposable(obj);
    }

    private class ExitDisposable : IDisposable
    {
        private readonly object obj;
        public ExitDisposable(object obj) { this.obj = obj; }
        public void Dispose() { Monitor.Exit(this.obj); }
    }
}</code>

Dieser Code versucht, asynchrones Sperren nachzuahmen, aber wie der Compiler angibt, neigt er dazu, innerhalb von ExitDisposable.Dispose() auf unbestimmte Zeit zu blockieren, was möglicherweise zu Deadlocks führt. Dies liegt daran, dass Monitor.Exit möglicherweise in einem anderen Thread ausgeführt wird als dem, der die Sperre erworben hat, wodurch möglicherweise die Sperrreihenfolge verletzt wird.

Im Wesentlichen ist das Verbot von await innerhalb von lock eine proaktive Maßnahme, um Deadlocks in Multithread-Anwendungen zu vermeiden. Es ist am besten, die Kombination asynchroner Vorgänge mit lock-Anweisungen zu vermeiden und alternative Synchronisierungsmethoden wie Leser-Schreiber-Sperren oder Synchronisierungsprimitive von System.Threading.

in Betracht zu ziehen

Das obige ist der detaillierte Inhalt vonWarum ist „await' in einer „lock'-Anweisung in C# verboten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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