Lorsque vous ajoutez un élément au System.Web.Caching.Cache
avec une date d'expiration absolue, comme dans l'exemple suivant, comment se comporte Asp.Net? Est-ce que cela:Quand Asp.Net supprime-t-il les éléments du cache expirés?
simplement marquer l'élément comme expiré, puis exécutez la
CacheItemRemovedCallback
sur la prochaine tentative d'accès?Supprimer l'élément du cache et exécuter le
CacheItemRemovedCallback
immédiatement?HttpRuntime.Cache.Insert(key, new object(), null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
MSDN semble indiquer qu'il se produit immédiatement. Par exemple, the "Expiration" section of the "ASP.NET Caching Overview" indique "ASP.NET supprime automatiquement les éléments du cache lorsqu'ils expirent." De même, l'exemple du sujet "How to: Notify an Application When an Item Is Removed from the Cache" indique "Si plus de 15 secondes s'écoulent entre les appels à GetReport
[une méthode dans l'exemple], ASP.NET supprime le rapport du cache."
Pourtant, aucun de ces deux n'est sans ambiguïté. Ils ne disent pas "le rappel est exécuté immédiatement" et je pourrais concevoir comment leurs auteurs auraient pu penser que l'option 1 ci-dessus compte comme "enlever" un article. J'ai donc fait un test rapide et sale, et voilà, il semble être en train de s'exécuter immédiatement - je reçois régulièrement des rappels de soixante-secondes même si personne n'accède à mon site. Néanmoins, mon test a été rapide et sale, et dans les commentaires à ma réponse à Is there a way to run a process every day in a .Net web application without writing a windows service or SQL server jobs, quelqu'un a suggéré qu'Asp.Net reporte effectivement la suppression et l'exécution du rappel jusqu'à ce que quelque chose tente à nouveau d'accéder au cache.
Quelqu'un peut-il régler cette autorité ou est-ce juste considéré comme un détail d'implémentation?
Je ne pense pas qu'il puisse y avoir une réponse faisant autorité à cette question parce que, comme Raymond Chen le fait remarquer si souvent, vous interprétez le comportement d'une version du logiciel comme faisant autorité pour toutes les futures versions. Dans mon expérience c'est une mauvaise idée car ASP.NET pourrait changer son comportement à tout moment et casser votre application. – dkackman
pourquoi ne pas le tester. Sur votre callback, écrivez dans un fichier et voyez la date de création et comment elle se rapporte à l'expiration. –
@dkackman - Je n'ai pas besoin de réponse "maintenant et pour toujours", je suis prêt à me contenter de réponses officielles pour .NET 2.0 et 3.5. Cela ne me semble pas être un simple détail de mise en œuvre: je m'attendrais à ce que la documentation indique quelque part que le retrait effectif n'est pas déterministe si tel était le cas. Peut-être que MS est en désaccord. J'essaie juste de voir si j'ai oublié quelque chose dans la documentation. –