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.
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