2012-11-08 17 views
9

Ich fürchte, ich kenne bereits die Antwort. Ich habe eine Klasse, die Serviceaufrufe und Caching abwickelt. Um mehrere Anrufe an den Dienst mit derselben Anfrage zu vermeiden, kann ich natürlich eine Sperre um den Codeblock verwenden, aber viele dieser Methoden haben unterschiedliche Argumente, die den Cache-Schlüssel bilden. Es ist eine Schande, darauf zu warten, dass ein Sperrcodeblock ausgeführt wird, wenn es sich um einen komplett anderen Cacheschlüssel (oder mehrere verschiedene Cacheschlüssel) handeln könnte.C# zu sperren oder nicht zu sperren

Ich weiß, ich könnte eine Sperre für die Cache-Schlüssel-String selbst, aber dies ist ein No-No gegeben, dass diese Zeichenfolge möglicherweise überall auftauchen könnte.

So kann ich entweder potenziell unnötige Anrufe an den Dienst ohne die Sperre führen ODER potenziell unnötige Verzögerungen innerhalb der Methode hinzufügen, indem ich auf die Sperre warte.

Sind das meine meine 2 Optionen oder gibt es noch eine?

Prost

+3

"Um mehrere Anrufe an den Dienst mit der gleichen Anfrage zu vermeiden, kann ich natürlich eine Sperre verwenden" - das klingt weniger als korrekt. Eine Sperre (System.Threading.Monitor.Enter/Exit) wird verwendet, um einen Codeblock zu markieren, der ausschließlich von einem einzelnen Thread nur für eine bestimmte Sperre ausgeführt wird. Es wird nicht auf magische Weise wiederholte Anrufe verschwinden lassen. Bitte poste einen Code, auf den die Antwort basieren könnte. – Tar

+0

@ default.kramer Sie könnten das tun, aber Sie müssten ein Wörterbuch dieser Objekte oder etwas ähnliches haben, so dass Sie es wieder mit einer anderen Zeichenfolge finden könnten. Sie müssen auch darauf achten, dass Ihre Logik zum Bestimmen, was Sie sperren müssen, nicht mehr Zeit und Aufwand erfordert als das Sperren von allem (was natürlich von den spezifischen Anwendungsfällen abhängt). – Servy

Antwort

7

könnten Sie möglicherweise, schalten Sie Ihre Typen um einen Thread-sicher-Klasse zu verwenden, wie zum Beispiel ein ConcurrentDictionary<T,U>, Ihre Caching zu behandeln. In geeigneter Weise würde dies die Notwendigkeit einer eigenen Sperrung verhindern, da Sie sich auf die feinkörnige Sperrung verlassen können, die in die gleichzeitige Sammlung integriert ist.