Quelle est la différence entre HttpContext.Actuel.Cache.Insert et HttpContext.Actuel.Cache.Ajouter

Je travaille sur un ASP.NET application web et je veux implémenter la mise en cache, donc je veux connaître la différence entre HttpContext.Current.Cache.Insert et HttpContext.Current.Cache.Add et lequel est le meilleur?

31
demandé sur Owidat 2012-01-30 14:03:56

3 réponses

La principale différence entre les deux est que si un objet avec le même nom existe déjà dans le cache, l'appel de méthode Insert sur votre instance de Cache remplacera l'objet, alors que l'appel de méthode Add échouera (tiré du paragraphe REMARQUES des méthodes Add et Insert sur leur page de référence MSDN respective):

Ajouter

Les appels à cette méthode échoueront si un élément avec le même paramètre clé est déjà stocké dans le Cache. De écraser un élément de Cache existant en utilisant le même paramètre clé, utilisez la méthode Insert.

Insérer

Cette méthode écrasera un élément de cache existant dont la clé correspond le paramètre clé.

L'autre différence principale est aussi qu'avec la méthode Add certains paramètres sont obligatoires, alors qu'avec Insert, diverses méthodes surchargées sont disponibles, et certains paramètres seront définis sur des valeurs par défaut comme les expirations absolues ou glissantes.

Vous pouvez voir qu'il n'y a pas de différence entre la méthode Add et la méthode Insert avec exactement les mêmes paramètres sauf que Insert n'échouera pas (c'est-à-dire ne rien faire) si un objet du même nom est dans le cache.

54
répondu Jalayn 2015-10-30 02:58:41

[MODIFIER] 2015-10-29 Voir le commentaire de Mark Sowul ci-dessous. UGH! [/EDIT]

Je viens de poster mes commentaires ci-dessous sur le lien (remarques) fourni par Jalayn. Quelqu'un ici des commentaires à ce sujet? Toute personne comptant sur une erreur lancée, veuillez voir mon dernier paragraphe ci-dessous et honte à vous! :)

Étant le type obstiné, j'ai pensé que je donnerais ceci un essai. J'ai écrit un code qui ressemble à quelque chose comme ça.

var myObject = new MyObjectType() { prop1 = "string 1", prop2 = 1 };
var cacheKey = "mycachekey";
var cTime = DateTime.Now.AddMinutes(11);
var cExp = System.Web.Caching.Cache.NoSlidingExpiration;
var cPri = System.Web.Caching.CacheItemPriority.Normal;

HttpContext.Current.Cache.Add(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 2"; myObject.prop2 = 2;
HttpContext.Current.Cache.Add(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 3"; myObject.prop2 = 3;
HttpContext.Current.Cache.Insert(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 4"; myObject.prop2 = 4;
HttpContext.Current.Cache.Insert(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 5"; myObject.prop2 = 5;
HttpContext.Current.Cache.Add(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 6"; myObject.prop2 = 6;
HttpContext.Current.Cache.Insert(cacheKey, myObject, null, cTime, cExp, cPri, null);

var foo = (MyObjectType)HttpContext.Current.Cache[cacheKey];

Devinez quoi. Il fonctionnait bien. J'ai même mis une pause pointez avant et après ce bloc de code et exécutez HttpContext.Actuel.Cache (dans la fenêtre immédiate de VS) à chaque point et vérifié qu'un seul élément a été ajouté au cache. Et toto.prop1 = "chaîne 6".

Quelqu'un de Microsoft soins pour expliquer pourquoi cela n'a pas jeté une exception? Bien que ce soit une mauvaise pratique (et notre application ne le fait pas), quelqu'un peut compter sur une erreur levée et leur application peut ne pas se comporter comme prévu car le CLR ne le fait pas jetez une erreur même si votre documentation le dit.

9
répondu Andrew Steitz 2015-10-29 20:53:38

Il est toujours mal compris ce Cache.Ajouter provoquera une erreur si on essaie d'ajouter un élément avec le même paramètre. Il ne lance aucune erreur / exception ou plutôt il ne mettra pas à jour et ne lance aucune erreur. Vérifiez l'article msdn ci-dessous où il est dit

Cache.Ajouter

Add méthode retourne l'objet que vous avez ajouté au cache. En outre, si vous utilisez la méthode Add et un élément portant le même nom existe déjà dans le cache, la méthode ne remplacera pas l'élément et ne va pas augmenter exception. http://msdn.microsoft.com/en-us/library/18c1wd61 (v=vs. 100).aspx

Cache.Insérer

Si vous utilisez la méthode Insert pour ajouter un élément au cache et un élément avec le même nom existe déjà, l'élément existant dans le cache est remplacé

Une autre différence est le Cache.Insert a 5 surcharges et Add en a une seule. Et Add method renvoie l'objet qui était dans le cache sous cette clé (null si un nouvel élément, sinon le élément actuellement dans le cache), alors que Insert ne renvoie rien.

Ajouter la méthode remarques indique que la mise à jour échoue. Je suppose que c'est une faute de frappe dans Ajouter une page. Je pense que ce qu'ils voulaient dire, c'est "les appels à cette méthode échoueront pour mettre à jour {[21] } si un élément avec le même paramètre clé est déjà stocké dans le Cache"

Vous pouvez essayer d'exécuter ce code et voir vous-même si vous obtenez une erreur / exception.

// returns null
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

// returns "Value 1"
Cache.Add("Key1", "Value 2", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
3
répondu Novice Programmer 2018-02-27 01:06:55