„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum wird in einer "Lock` -Aussage in C#warten" verboten?

Warum wird in einer "Lock` -Aussage in C#warten" verboten?

Gepostet am 2025-03-04
Durchsuche:564

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

die Einschränkung verstehen: warte und lock in c#

c#'s warte Schlüsselwort ist entscheidend für asynchrone Programmierungen, was nicht blockierende Operationen ermöglicht. Ich erwarte jedoch in einer lock Aussage ist strengstens untersagt. Diese Einschränkung ist eine wichtige Auswahl an Designs, um eine gemeinsame Fehlerquelle zu verhindern: Deadlocks.

Microsofts Dokumentation erklärt, dass ein Ausdruck in einem lock ein Risiko erstellt. Die Ausführung des Codes kann innehalten, nachdem die auf auf die Kontrolle erwartet und später einen potenziell anderen Thread wieder aufnehmen kann. Diese Zeitlücke kann zu Situationen führen, in denen andere Threads Schlösser erhalten, die Verriegelungsreihenfolge umkehren und zu einem Deadlock führen.

Lassen Sie uns ein hypothetisches Beispiel untersuchen:

class Async
{
    public static async Task 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); }
    }
}

Dieser Code versucht, asynchrones Sperren nachzuahmen, aber wie der Compiler angibt, ist er anfällig für unbestimmte Blockierung innerhalb von exitSisposable.disposse () , was möglicherweise zu Deadlocks führt. Dies geschieht, weil monitor.exit möglicherweise in einem anderen Thread ausgeführt werden als derjenige, der das Schloss erworben hat, und möglicherweise verletzt die Schlossbestellung.

im Wesentlichen ist das Verbot von in lock eine proaktive Maßnahme, um Deadlocks in Multithread -Anwendungen zu vermeiden. Es ist am besten, asynchrone Operationen mit lock -Anweisungen zu kombinieren und alternative Synchronisierungsmethoden wie Leser-Tritt-Sperren oder Synchronisation Primitive von system.threading zu betrachten.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3