Ich habe ein Problem mit dem gemeinsamen Zugriff bei der Verwendung von Monitor.Enter und Monitor.Exit. Manchmal hängt mein Code auf der folgenden Monitor.Exit Anweisung:Monitor.Exit() manchmal hängt
public void EndInit()
{
Monitor.Enter(this.lockObj);
this.initCount--;
if (this.initCount == 0) {
this.IsInitializing = false;
this.IsInitialized = true;
this.OnInitialized();
}
// sometimes, this Exit will never return ...
Monitor.Exit(this.lockObj);
}
Es gibt nur einen anderen Ort, wo mein lockObj verwendet wird:
public void BeginInit()
{
Monitor.Enter(this.lockObj);
this.initCount++;
this.IsInitializing = true;
this.IsInitialized = false;
Monitor.Exit(this.lockObj);
}
Und das ist, wie ich dieses Sync-Objekt deklarieren:
private readonly object lockObj = new object();
ich reißen meine Haare, um herauszufinden, aus, was es hier vor sich geht, aber ohne Erfolg. Ich würde erwarten, Monitor.Enter()
zu blockieren, bis mein Sync-Objekt freigegeben wird, aber warum ist Monitor.Exit()
blockiert? Ich kann keine Erklärung für dieses Verhalten in MSDN entweder finden.
Hinweis Ich kann dieses Verhalten nicht reproduzieren, es tritt eher zufällig auf (gut, ich weiß, dass "zufällig" nicht die richtige Formulierung ist).
Alle Ideen oder hilfreiche Hinweise werden sehr geschätzt!
Thorsten
Wenn möglich, dass Sie die 'Monitor.Enter' /' Monitor.Exit' Kombination mit einem 'Schloss ersetzen könnte() {}' Block. Was würde passieren, wenn vor dem Aufruf 'Monitor.Exit' eine Ausnahme ausgelöst wird? – Dbuggy