Sind die folgenden Annahmen für diesen Code gültig? Ich habe einige Hintergrundinformationen unter den Code gestellt, aber ich denke nicht, dass es relevant ist.Erstellen von dynamischen Sperren zur Laufzeit in ASP.NET
Annahme 1: Da dies eine einzelne Anwendung ist, mache ich die Annahme, dass es von einem einzigen Prozess behandelt wird. Daher werden statische Variablen zwischen Threads geteilt, und das statische Deklarieren meiner Sammlung von Sperrobjekten ist gültig.
Annahme 2: Wenn ich weiß, dass der Wert bereits im Wörterbuch ist, muss ich nicht lesen lesen. Ich könnte ein ConcurrentDictionary verwenden, aber ich glaube, dass dieses sicher ist, da ich nicht aufzählen (oder löschen), und der Wert wird existieren und nicht ändern, wenn ich UnlockOnValue()
aufrufen.
Annahme 3: Ich kann die Keys-Auflistung sperren, da diese Referenz nicht geändert wird, auch wenn die zugrunde liegende Datenstruktur dies tut.
private static Dictionary<String,Object> LockList =
new Dictionary<string,object>();
private void LockOnValue(String queryStringValue)
{
lock(LockList.Keys)
{
if(!LockList.Keys.Contains(queryStringValue))
{
LockList.Add(screenName,new Object());
}
System.Threading.Monitor.Enter(LockList[queryStringValue]);
}
}
private void UnlockOnValue(String queryStringValue)
{
System.Threading.Monitor.Exit(LockList[queryStringValue]);
}
Dann würde ich diesen Code wie verwenden:
LockOnValue(Request.QueryString["foo"])
//Check cache expiry
//if expired
//Load new values and cache them.
//else
//Load cached values
UnlockOnValue(Request.QueryString["foo"])
Hintergrund: ich eine App in ASP.NET mich zu erwecken, dass die Download-Daten basierend auf einer einzigen benutzerdefinierten Variablen in der Abfrage Zeichenfolge. Die Anzahl der Werte wird sehr begrenzt sein. Ich muss die Ergebnisse für jeden Wert für einen bestimmten Zeitraum zwischenspeichern.
Ansatz: entschied ich mich lokale Dateien zu verwenden, um die Daten zu zwischenzuspeichern, die nicht die beste Option ist, aber ich wollte es versuchen, da dies nicht kritisch ist und die Leistung ist kein großes Problem. Ich benutzte 2 Dateien pro Option, eine mit dem Cache-Ablaufdatum und eine mit den Daten.
Ausgabe: Ich bin nicht sicher, was der beste Weg, Verriegelung zu tun ist, und ich bin nicht allzu vertraut mit Threadingprobleme in .NET (einer der Gründe, warum ich diesen Ansatz gewählt haben). Basierend auf dem, was verfügbar ist, und was ich lese, dachte ich, dass das oben genannte funktionieren sollte, aber ich bin mir nicht sicher und wollte eine zweite Meinung.
Was ist das Problem mit 'HttpRuntime.Cache'? – scottm
Das war meine erste Wahl, aber es hat sich merkwürdig verhalten. Vielleicht liegt es daran, dass meine Seite die Antwort löscht und eine Textdatei zurückgibt, aber ich habe nicht zu tief gegraben, nachdem ich auf ähnliche Probleme gestoßen war, die im gesamten Internet veröffentlicht wurden, ohne Antworten, die für mich funktionierten. Die einzige Sache, auf die ich nicht eingegangen bin, war die IIS-Konfiguration und ob Caching korrekt konfiguriert wurde. Ich mache das vielleicht später noch, aber es ist so unkritischer Code und das warf Fragen auf, auf die ich Antworten wollte, auch wenn es nicht die beste Architektur ist. – Kendrick
Ich versuche eine sehr ähnliche Lösung zu implementieren, in der ich Methodenergebnisse zwischenspeichere. Ich brauche auch eine Möglichkeit, verschiedene Cache-Sperren zu erstellen, und ich frage mich, ob Ihre Lösung den Test der Zeit überstanden hat, Prost. –