mboost-dp1

c# cache problem / spørgsmål


Gå til bund
Gravatar #1 - milandt
5. maj 2010 16:43
Hvorfor giver følgende problemer:

public static void RemoveFromCache(string key)
{
if (HttpContext.Current.Cache[key] != null)
HttpContext.Current.Cache.Remove(key);

if (HttpContext.Current.Cache[key] != null)
RemoveFromCache(key);
}


Ovenstående generere i fleste tilfælde en uendelig løkke der giver en stack overflow exception. Det er som om at tjek nummer to på om cache-objektet findes bliver afviklet før .NET har nået at fjerne objektet fra cachen, og dermed bliver metoden kaldt igen og igen.

Jeg har brugt en god del for mange timer i dag på at finde ud af at ovenstående var roden til et problem på et site jeg arbejder på.. men hvorfor er det et problem? Burde virke i mine øjne. Tjek nummer to burde altid returnere false.
Gravatar #2 - arne_v
5. maj 2010 16:52
#1

Det er vel altid muligt at en anden request indsætter key i Cache mellem de to test?

Men det burde dog ikke give en uendelig rekursion.

Er du sikker på at der ikke er noget relevant i den kode du ikke viser?
Gravatar #3 - arne_v
5. maj 2010 16:54
#fortsat

Et oplagt spørgsmål er jo: hvorfor er den sidste del der?

Hvorfor overhovedet have metoden fremfor at bruge:

HttpContext.Current.Cache.Remove(key);
Gravatar #4 - røvskæg
5. maj 2010 17:50
Uden at være c# mester ville jeg påstå at følgende ikke virker som du tror:

HttpContext.Current.Cache.Remove(key);

Gravatar #5 - Windcape
5. maj 2010 17:59
Overvej også følgende (mere ren kode)


if (HttpContext.Current.Cache.ContainsKey(key))
{
HttpContext.Current.Cache.Remove(key);
}
Gravatar #6 - røvskæg
5. maj 2010 18:03
Jeg elsker ellers sådanne programerrings sikkerhedsnet(som aldrig aligevel er særlig smarte)
public static void RemoveFromCache(string key)
{
if (HttpContext.Current.Cache[key] != null)
HttpContext.Current.Cache.Remove(key);

if (HttpContext.Current.Cache[key] != null)
RemoveFromCache(key);

}

Gravatar #7 - arne_v
5. maj 2010 18:03
#1 & 5

Hvorfor teste?

Docs siger:


Parameters

key
Type: System.String
A String identifier for the cache item to remove.

Return Value
Type: System.Object
The item removed from the Cache. If the value in the key parameter is not found, returns null.
Gravatar #8 - røvskæg
5. maj 2010 18:05
super sikkert ;-)

while( HttpContext.Current.Cache.Remove(key)!=null );
Gravatar #9 - milandt
5. maj 2010 18:12
arne_v (2) skrev:
Er du sikker på at der ikke er noget relevant i den kode du ikke viser?
Det er et sammenskrevet eksempel der illustrerer hvordan jeg forestillede mig at det jeg havde kodet blev afviklet.

En nærmere gennemgang viser dog at jeg tilsyneladende er en skovl til at kode.
Gravatar #10 - røvskæg
5. maj 2010 18:31
Hvis det er nogen trøst, er det ikke første qang, cache giver meget mystiske problemer.
Gravatar #11 - Windcape
6. maj 2010 01:26
arne_v (7) skrev:
Hvorfor teste?
Fordi at jeg slet ikke kunne forestille mig at læse dokumentation til en collection class ;-)
Gravatar #12 - arne_v
12. maj 2010 19:27
milandt (9) skrev:
Det er et sammenskrevet eksempel der illustrerer hvordan jeg forestillede mig at det jeg havde kodet blev afviklet.

En nærmere gennemgang viser dog at jeg tilsyneladende er en skovl til at kode.


Det er derfor begrebet SSCCE er opfundet!
Gravatar #13 - arne_v
12. maj 2010 19:32
Windcape (11) skrev:
Fordi at jeg slet ikke kunne forestille mig at læse dokumentation til en collection class


I det her tilfælde er der ellers god grund til det.

Man ved aldrig hvad der sker med maps/dictionaries og ikke-eksisterende keys uden at nærlæse det med små bogstaver.

Gravatar #14 - milandt
15. maj 2010 15:33
arne_v (12) skrev:
Det er derfor begrebet SSCCE er opfundet!


Det var faktisk det jeg havde forsøgt mig med :-) uden at vide at der fandtes et begreb for dette. Jeg havde dog stirret mig blind på fejlen og derfor var der heller ingen fejl i mit eksempel.
Gravatar #15 - arne_v
16. maj 2010 00:09
#14

En SSCCE skal kunne køres og reproducere problemet.

http://sscce.org/
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login