Я не уверен, имеет ли это смысл в контексте, который вы видите, но единственное использование «разрывов» в вычислениях, с которыми я знаком, - это когда данные из разных кадров отображаются на экране одновременно. [111 ]
В Википедии есть статья , если вы хотите больше данных.
Если это не «разрыв», с которым вы сталкиваетесь, возможно, вы могли бы предоставить немного больше контекста? Если код с открытым исходным кодом, ссылки на него будут великолепны.
Можно использовать VaryByCustom
параметр для этого.
В Вашем пользовательском элементе управления у Вас было бы следующее:
<%@ OutputCache Duration="1000" VaryByParam="None" VaryByCustom="MyKey" %>
Затем Вы переопределили бы GetVaryByCustomString
метод в Вашем Global.asax как так:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "MyKey")
{
object o = context.Current.Application["MyGuid"];
if (o == null)
{
o = Guid.NewGuid();
context.Current.Application["MyGuid"] = o;
}
return o.ToString();
}
return base.GetVaryByCustomString(context, arg);
}
Наконец в MyPage.aspx
Вы сделали бы это:
Application["MyGuid"] = Guid.NewGuid();
, Как это работает?
Каждый раз, когда Ваше управление кэшируется, оно связано со строкой (строка, возвращенная из GetVaryByCustomString
метод, когда Ваше управление VaryByCustom
ключ передается в него).
Каждый раз, когда управление впоследствии используется, GetVaryByCustomString
, назван снова. Если возвращаемая строка соответствует кэшированной версии управления, то кэшированная версия используется.
В нашем случае, "MyKey" передается в GetVaryByCustomString
, и он возвращает то, что хранится в [1 110].
Каждый раз, когда MyPage.aspx
назван, это изменяется Application["MyGuid"]
на новое случайное значение.
, Когда Ваше управление затем используется GetVaryByCustomString
, метод возвратит новое значение, и потому что нет никакой кэшированной версии управления, связанного с тем значением, управление будет повторно создано. (Управление будет затем кэшироваться и связываться с новым значением, для сохранения до следующего вызова к [1 114] и т.д.)
существует обзор здесь .
Редактирование: при включении ядра, кэширующегося на II6 + затем, необходимо будет пойти с советом Luke и использовать заголовок VaryByCustom, поскольку очищающийся кэш ASP.NET не будет влиять на кэш ядра.
OutputCache хранится в Кэше ASP.NET, таким образом, можно просто назвать Кэш. Удалите:
List<string> keys = new List<string>();
foreach(string key in HttpRuntime.Cache)
{
keys.Add(key);
}
foreach(string key in keys)
{
Cache.Remove(key);
}
Это, однако, удалит ВСЕ записи кэша, включая пользовательские записи, добавленные Вашим кодом.
Вдохновившись другим постом, следующий фрагмент успешно удаляет каждую страницу, кэшированную OutputCache
в asp.net с помощью отражения:
public static void ClearOutputCache()
{
var runtimeType = typeof(HttpRuntime);
var ci = runtimeType.GetProperty(
"CacheInternal",
BindingFlags.NonPublic | BindingFlags.Static);
var cache = ci.GetValue(ci, new object[0]);
var cachesInfo = cache.GetType().GetField(
"_caches",
BindingFlags.NonPublic | BindingFlags.Instance);
var cacheEntries = cachesInfo.GetValue(cache);
var outputCacheEntries = new List<object>();
foreach (Object singleCache in cacheEntries as Array)
{
var singleCacheInfo =
singleCache.GetType().GetField("_entries",
BindingFlags.NonPublic | BindingFlags.Instance);
var entries = singleCacheInfo.GetValue(singleCache);
foreach (DictionaryEntry cacheEntry in entries as Hashtable)
{
var cacheEntryInfo = cacheEntry.Value.GetType().GetField("_value",
BindingFlags.NonPublic | BindingFlags.Instance);
var value = cacheEntryInfo.GetValue(cacheEntry.Value);
if (value.GetType().Name == "CachedRawResponse")
{
var key = (string)cacheEntry.Value.GetType().BaseType.GetField("_key", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cacheEntry.Value);
key = key.Substring(key.IndexOf("/"));
outputCacheEntries.Add(key);
}
}
}
foreach (string key in outputCacheEntries)
{
HttpResponse.RemoveOutputCacheItem(key);
}
}
Вы можете использовать HttpResponse.RemoveOutputCacheItem
или HttpResponse.AddCacheItemDependency
для аннулирования записей выходного кэша.
вы можете добавить строку кода HttpResponse.RemoveOutputCacheItem("/YourCachePageName.aspx"); в событие загрузки страницы, загрузки которой вы ожидаете, что кэш страницы слетит.