如何正确处理添加新项目到字典?

时间:2012-06-14 05:49:41

标签: c# asp.net dictionary add

我有一个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();
        }
    }

或者将其保留在第一个代码段中?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

您可以再实施一种方法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();
    }
}

我也建议使用ConcurrentDictionaryHere是ConcurrentDictionary的代码。

答案 1 :(得分:0)

只执行两次:

cacheItems.Add(key, data);

......你会知道答案。基本上,异常将被try / finally块抛出并捕获。我个人会使用if语句而不是将所有逻辑责任放在try块上,但这是一个偏好的问题......