2008-11-06 20 views
12

Ben ASP.NET önbellek öğeleri her 20 saniyede muayene (ve muhtemelen kaldırıldı) fark ettim (HH ve işin garibi her zaman: MM: 00, HH: MM: 20 ve HH: MM: 40). Bu parametreyi nasıl değiştirileceğini öğrenmek için yaklaşık 15 dakika harcadım. Ayrıca web.config aşağıdaki tespitleri çalıştı, ama yardım etmedi: Ben deli bir şey yapmaya çalışmıyorumASP.NET önbellek maddesi kullanım süresinin değiştirilmesi sıklığı?

<cache privateBytesPollTime="00:00:05" /> 

ama diyelim ki oldu, 5 saniye yerine eğer iyi olurdu 20 veya başvurum için en az 10.

cevap

19

aralık kodlanmış olduğunu ortaya koymaktadır. Son Kullanma kimin statik yapıcı

_tsPerBucket = new TimeSpan(0, 0, 20); 

_tsPerBucket içeren readonly olan bir iç CacheExpires sınıf tarafından işlenir, bu nedenle daha sonra değiştirir herhangi bir yapılandırma ayarı var olamaz.

süresi dolan öğeler için onay sonra CacheExpires.EnableExpirationTimer() yılında kurulduğundan tetikleyecek zamanlayıcı ...

DateTime utcNow = DateTime.UtcNow; 
TimeSpan span = _tsPerBucket - new TimeSpan(utcNow.Ticks % _tsPerBucket.Ticks); 
this._timer = new Timer(new TimerCallback(this.TimerCallback), null, 
    span.Ticks/0x2710L, _tsPerBucket.Ticks/0x2710L); 

span hesaplanması sağlayan tam olarak üzerinde zamanlayıcı yangınlar: 00: 20: 40 saniye Ancak rahatsız etmem için bir neden göremiyorum. Zamanlayıcıların çağırdığı yöntem internal'dur, bu yüzden kendimi daha sık çağırmak için kendi zamanlayıcınızı ayarlamanın bir yolu olduğunu düşünmüyorum (yansıma görmezden geliyor).

Ancak, iyi haber gerçekten aralıkta umurumda için bir neden yok gerektiğidir. Cache.Get() çekler öğesi süresi dolmamış ve sonra varsa hemen önbellekten öğeyi kaldırır ve null döndüren. Bu nedenle, son kullanma tarihi geçen parçalar 20 saniye kadar önbellekte kalsa bile, önbellekten süresi dolmuş bir öğe almazsınız.

2

documentation göre, privateBytesPollTime "alt işlem bellek kullanımı" içindir ve varsayılan 1 saniyedir. Bunun, önbellek öğesinin kaldırılmasıyla ilgili olduğunu sanmıyorum. 20 ve:

Ben, ürün dakikada altındaki kaldırılır gibi görünüyor callback- bir öğe kaldırma kullanarak sonuçlarınızı doğruladı 40 saniye. Bu, bir öğenin önbellekte, AbsoluteExpiration setinde 20 saniye kadar kalabileceğini gösterir. 20 saniyelik yoklama aralığının değiştirilip değiştirilemeyeceğini belirten herhangi bir belge bulamadım. Reflektör poking

2

Çılgın, fakat çalışma çözeltisi (tüm adımlar gereklidir):

// New value for cache expiration cycle 
// System.Web.Caching.CacheExpires._tsPerBucket; 
// Set 1 seconds instead of 20sec 
const string assembly = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; 
var type = Type.GetType("System.Web.Caching.CacheExpires, " + assembly, true, true); 
var field = type.GetField("_tsPerBucket", BindingFlags.Static | BindingFlags.NonPublic); 
field.SetValue(null, TimeSpan.FromSeconds(1)); 

// Recreate cache 
// HttpRuntime._theRuntime._cacheInternal = null; 
// HttpRuntime._theRuntime._cachePublic = null; 
type = typeof (HttpRuntime); 
field = type.GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic); 
var runtime = field.GetValue(null); 
field = type.GetField("_cachePublic", BindingFlags.NonPublic | BindingFlags.Instance); 
field.SetValue(runtime, null); 
field = type.GetField("_cacheInternal", BindingFlags.NonPublic | BindingFlags.Instance); 
field.SetValue(runtime, null); 
İlgili konular