If you are using caching in ASP.net, and when your cache invalidates, you see some really bad performance or race conditions, you probably need to implement object locks.
Object myObjectLock = new object();
//Use the lock statement to ensure that only one request
//check again if the cache is not populated by another request
if (HttpRuntime.Cache["myCacheKey"] == null)
DataTable cacheValue = GetDataFromDatabase();
//remove the cache key
//insert into the cache
HttpRuntime.Cache.Insert("myCacheKey", cacheValue, null, DateTime.Now.AddHours(8), TimeSpan.Zero);
Now, when your cache is rebuilt, you will avoid race conditions and bad performance on your site/database.