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?
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.
[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.
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);