我在我的WCF服務中使用.Net 4.0 MemoryCache。 我原來用的是默認的緩存如下:.Net 4.0 MemoryCache清除
var cache = MemoryCache.Default;
然後做通常的模式是試圖在緩存中找到的東西,得到,然後 設置到緩存中,如果沒有找到(代碼段/僞代碼如下所示):
var geoCoordinate = cache.Get(cacheKey) as GeoCoordinate;
if (geoCoordinate == null)
{
geoCoordinate = get it from somewhere;
cache.Set(cacheKey, geoCoordinate, DateTimeOffset.Now.AddDays(7));
}
我發現我的參賽作品在約。 2分鐘。即使我的代碼將丟失的條目放回緩存中,隨後的緩存獲取也會返回null。 我的WCF服務由IIS 7.5託管。如果我回收應用程序池,則一切正常工作2分鐘,但之後將重複上述模式。
經過一番研究,我做了下面的代替: var cache = MemoryCache.Default;
//用新代碼來創建CACHE如下:
var config = new NameValueCollection();
//Hack: Set Polling interval to 10 days, so will no clear cache.
config.Add("pollingInterval", "10:00:00:00");
config.Add("physicalMemoryLimitPercentage", "90");
config.Add("cacheMemoryLimitMegabytes", "2000");
//instantiate cache
var cache = new MemoryCache("GeneralCache", config);
看來,不管我放到physicalMemoryLimitPercentage
,或cacheMemoryLimitMegabytes
似乎並沒有幫助。但把pollingInterval
放大到datespan
呢。
ie:如果我設置如下: config.Add(「pollingInterval」,「00:00:15:00」); 然後一切正常工作15分鐘。
注意:如果我的WCF服務由我的開發環境上的IISExpress託管,我無法重現。 當我的WCF服務由IIS 7.5託管時,這似乎也發生了。 我在IIS 7.5上的應用程序池沒有被回收。
有沒有人經歷過這樣的事情? 我看到了下面: MemoryCache does not obey memory limits in configuration
感謝,
馬特
解決方法a未來的QFE解決方案已由MS發佈在我提交的錯誤上https://connect.microsoft.com/VisualStudio/feedback/details/764911/memorycache-gets-disposed-after-pollinginterval-when-used -in-webapp-in-integrated-pipeline-mode#詳細信息以及確認這在.net 4.5中得到了解決 – scubadam