2

静的クラスをキャッシュとして使用する ASP.NET アプリケーションがあります。その静的クラスの内部には、キャッシュされたオブジェクトを保持する内部ディクショナリがあります。もちろん、静的クラスには Add/Remove/Clear などのメソッドがあります... 次のようになります。

public static class CacheManager
{
    private static Dictionary<string, object> cacheItems = new Dictionary<string, object>();

    private static ReaderWriterLockSlim locker = new ReaderWriterLockSlim();

    public static Dictionary<string, object> CacheItems
    {
        get
        {
            return cacheItems;
        }
    }

    public static void AddCacheItem(string key, object data)
    {
        locker.EnterWriteLock();
        try
        {
            cacheItems.Add(key, data);
        }
        finally
        {
            locker.ExitWriteLock();
        }
    }

    ...
}

ASP.NET アプリケーションの実行時に、項目がキャッシュ (辞書) に追加されました。キーが既にこの方法で追加されている場合、たとえば Add メソッドで確認する必要があるかどうかを尋ねたいだけです。

    public static void AddCacheItem(string key, object data)
    {
        locker.EnterWriteLock();
        try
        {
            if (!cacheItems.ContainsKey(key))
            {
                cacheItems.Add(key, data);
            }
        }
        finally
        {
            locker.ExitWriteLock();
        }
    }

または、最初のコード スニペットのままにしますか?

前もって感謝します。

4

2 に答える 2

4

もう 1 つのメソッド TryAdd を実装できます

public static bool TryAddCacheItem(string key, object data)
{
    locker.EnterWriteLock();
    try
    {
        if (cacheItems.ContainsKey(key))
        {
            return false;
        }
        cacheItems.Add(key, data);
        return true;
    }
    finally
    {
        locker.ExitWriteLock();
    }
}

また、 ConcurrentDictionaryを使用することをお勧めします。ConcurrentDictionary のコードは次のとおりです

于 2012-06-14T05:54:48.143 に答える
0

2回実行するだけです:

cacheItems.Add(key, data);

…そして、あなたは答えを知るでしょう。基本的に、例外は try/finally ブロックによってスローされ、キャッチされます。個人的には、すべてのロジックの責任を try ブロックに置くのではなく、if ステートメントを使用しますが、それは好みの問題です...

于 2012-06-14T05:57:50.103 に答える