hab mich hier lange nicht gemeldet, aber jetzt ein Problem, dass ich logisch nicht erklären kann:
Der Code ist ~4 Jahre alt und benutzt ein Dictionary für ein internes Caching.
private static Dictionary<int, Tuple<DateTime, object>> myDict = new ..
void foo(key int)
{
if (myDict .ContainsKey(key))
{
var result = myDict[key];
if ((DateTime.Now - result.Item1) > TimeSpan.FromMinutes(5)) //5 Minutes Cache
{
myDict.Remove(key);
}
else
{
return result.Item2;
}
}
[..] load from DB
if (myDict .ContainsKey(key))
myDict[key] = new Tuple<DateTime,object>(DateTime.Now, data);
else
myDict.Add(key, new Tuple<DateTime, object>(DateTime.Now, data));
return data;
}
Code ist gekürzt und anonymisiert.
Das ganze ist nicht durch ein lock geschützt, noch wird z.B. ein ConcurrentDictionary verwendet. Wie gesagt, alter, funktionierender Code.
Meine Frage ist also - außer dass das jetzt etwas korrigiert wird - was sorgt dafür, dass das ganze nicht nur manchmal wegen einem threading Problem (in der Routine) auf die Schnauze fällt, sondern mehrere Stunden eine IndexOutOfRangeException beim Insert (Add) in das Dictionary erzeugt?
Threading-Problem hat das ganze sicher. Ein static überlebt keinen Prozesswechsel (AppPool Recycle)
Ich steh gerade auf dem Schlauch...
:-)
Xynratron