Fehler mit ReaderWriterLockSlim

8

Ich habe diese Ausnahme erhalten      Die Lesesperre wird freigegeben, ohne gehalten zu werden.
         bei System.Threading.ReaderWriterLockSlim.ExitReadLock ()          um .. GetBreed (String)

Unten ist die einzige Stelle im Code, die auf die Sperre zugreift. Wie Sie sehen können, gibt es keine Rekursion. Ich habe Probleme zu verstehen, wie diese Ausnahme auftreten könnte.

%Vor%     
dan 24.04.2012, 17:45
quelle

2 Antworten

3

Ich nehme an, Sie haben etwas, das in den Anfang geht, und beim Auslösen der Sperre wird eine Ausnahme ausgelöst. Es gibt eine Catch-22, ob Sie "das Schloss", "versuchen" vs "versuchen", "nehmen Sie das Schloss", aber das "nehmen Sie das Schloss", "versuchen" hat weniger Fehlerfälle (die "zwischen Take und abgebrochen versuchen Sie "ist so verschwindend unwahrscheinlich, dass Sie nicht betonen müssen."

Verschieben Sie die "nehmen Sie die Sperre" außerhalb der "versuchen", und sehen Sie, was die tatsächliche Ausnahme ist.

Das Problem ist höchstwahrscheinlich, dass Sie die Sperre nicht übernehmen (wahrscheinlich Re-Entrance) und dann versuchen, etwas freizuschalten, das Sie nicht genommen haben. Das könnte bedeuten, dass die Ausnahme im orginal Code auftaucht, der die Sperre angenommen hat, weil sie zweimal versucht hat, wenn sie nur einmal ausgeführt wurde.

Hinweis: Der Monitor verfügt über neue Überladungen mit "ref bool" -Parametern, die bei diesem Szenario helfen sollen - nicht jedoch die anderen Sperrtypen.

    
Marc Gravell 24.04.2012, 18:00
quelle
3

Verwenden Sie LockRecursionPolicy.SupportsRecursion beim Instanziieren der RWLS. Wenn der Fehler verschwindet, haben Sie tatsächlich eine Art von Rekursion beteiligt. Vielleicht ist es in Code, den Sie nicht posten?

Und wenn Sie wirklich daran interessiert sind, maximale Nebenläufigkeit daraus zu ziehen (wie ich vermute, dass Sie da eine RWLS verwenden), dann könnten Sie das doppelt überprüfte Sperrmuster verwenden. Beachten Sie, wie sich Ihr ursprünglicher Code bereits anfühlt? Warum also im Busch herumtollen? Mach es einfach.

In der folgenden Code-Notiz behandle ich die Breeds -Referenz immer als unveränderlich und dann innerhalb der lock , überprüfe, kopiere, ändere und tausche die Referenz aus.

%Vor%     
Brian Gideon 24.04.2012 18:48
quelle