Cache with Callback problems... threading?

  • Thread starter Thread starter Brian Vallelunga
  • Start date Start date
B

Brian Vallelunga

I'm having a problem using the Cache object with asp.net. Here is what I
have:
1) I put something in cache and set its callback method.
2) The object times out after X minutes and calls the callback method
specified.
3) The callback method gets the newest version of the item from the db and
then calls a helper method to put the item back into cache. It looks like
this:

//Pseudocode
// Called once by app
Initialize()
{
Data myData = DataTier.GetData();
AddDataToCache("key", myData);
}

// Puts item into cache with 10 minute expiration AddDataToCache(string key,
object data) {
// Delegate for expiring callback
CacheItemRemovedCallback onRemove;
onRemove = new CacheItemRemovedCallback(RemovedCallback);
// Add data to the cache
HttpContext.Current.Cache.Add(key, data, null, DateTime.Now.AddMinutes(10),
TimeSpan.Zero, CacheItemPriority.High, onRemove);
}

// Called when item expires
RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
Data myData = DataTier.GetData();
AddDataToCache(key, myData);
// Any code here won't be called!
}



That's basically the scenario. Ideally, I would initialize the system once,
and then it would automatically refresh the data within it every time the
cache expired.
When debugging though, after the cache times out, the item is not put back
in. It is very strange. RemovedCallback is called, but if I put a trace
statement after the AddDataToCache method call, the trace is never written.
Does anyone have an idea as to what is happening?
Thanks,
Brian
 
Hi,

Here is the problem ... you are using the current context to get the
application and set the cache. This works perfectly when the application
init. But when the cache remove callback called there isn’t any request
and the current context not existing. To overcome this issue add private
variable to the global class that will hold the application then set him
when the application start. Now you can use the application variable.

you can see my example (and download) from :
http://www.developersdex.com/gurus/code/653.asp

Natty Gur, CTO
Dao2Com Ltd.
28th Baruch Hirsch st. Bnei-Brak
Israel , 51114

Phone Numbers:
Office: +972-(0)3-5786668
Fax: +972-(0)3-5703475
Mobile: +972-(0)58-888377

Know the overall picture
 
Hmm... thanks for the help. Unfortunately, I don't think the method
described below will help me. The page I am using this on actually caches
many different things, and I don't know what all of them will be at the
start of the application. Do you have an idea of how I could still go about
doing this?

Brian
 
I think you miss understand me. What I suggested is to save the
application in a class level variable inside the global class so you can
use it when the cache period will be finish and you want to refill the
cache.

Natty Gur, CTO
Dao2Com Ltd.
28th Baruch Hirsch st. Bnei-Brak
Israel , 51114

Phone Numbers:
Office: +972-(0)3-5786668
Fax: +972-(0)3-5703475
Mobile: +972-(0)58-888377

Know the overall picture
 
Back
Top