ASP.NETは現在のCacheアイテムをすべてクリアする方法


最近、Cacheを大量に作っているサイトをテストしていますが、テストの過程でCacheの物の中の資料を全部空にしてから、元のASPを発見すると言いたいと思っています.NETに内蔵されているCacheアイテム(System.Web.Caching.Cache)はClear()を支援する方法がなく、一行ですべてのCacheアイテムをクリアすることはできませんが、Cacheがあるかどうか試してみました.Keysアイテム、foreachですべてのCacheのKeysを取得させて、さらに一つ一つ削除させて、結果もありません!すべてのCacheのKeysをすべて取り出して削除するには、次のプログラムコードを使用します.
IDictionaryEnumerator cacheEnum = Cache.GetEnumerator();

while (cacheEnum.MoveNext())
{
    Cache.Remove(cacheEnum.Key.ToString());
}

各Cache要素を1つずつ取り出しながらループ中に1つずつ削除しているので、EnumeratorでExceptionは発生しませんか?MSDNのIDictionaryEnumeratorインターフェースについての説明を調べてみると、次のように書かれています.
コレクションが一定に保たれている限り、列挙値は有効に保たれます.要素の追加、変更、削除などのコレクションを変更した場合、列挙値は常に無効になり、MoveNextまたはResetを再度呼び出すとInvalidOperationExceptionに戻ります.MoveNextとCurrentの間でセットを変更すると、値が無効になっていても、Currentは設定した要素に戻ります.
しかし、私は自分でこのプログラムのコードを実験した結果、何の間違いもありませんでしたが、なんだか変な感じがしました.その後、私は次のコードに変更しました.念のためです.
List<string> cacheKeys = new List<string>();
IDictionaryEnumerator cacheEnum = Cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
    cacheKeys.Add(cacheEnum.Key.ToString());
}
foreach (string cacheKey in cacheKeys)
{
    Cache.Remove(cacheKey);
}

それ以外に、Extension Methodが直接Clear()メソッドをSystemに拡張することを書きました.Web.Caching.Cacheカテゴリに行って、後で使用する上でもっと直感的にすることができます:
using System;
using System.Web.Caching;
using System.Collections;
using System.Collections.Generic;

/// <summary>
///    System.Web.Caching       Extension Methods
/// </summary>
static public class CacheExtensionMethod
{
    public static void Clear(this Cache x)
    {
        List<string> cacheKeys = new List<string>();
        IDictionaryEnumerator cacheEnum = x.GetEnumerator();
        while (cacheEnum.MoveNext())
        {
            cacheKeys.Add(cacheEnum.Key.ToString());
        }
        foreach (string cacheKey in cacheKeys)
        {
            x.Remove(cacheKey);
        }
    }
}

使用する場合は、次の構文を使用して、現在のスナップショットアイテムをすべて直接消去できます.
protected void Page_Init(object sender, EventArgs e)
{
    Cache.Clear();
}