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

本文关键字:添加 新项目 字典 正确处理 | 更新日期: 2023-09-27 18:37:11

我有一个 ASP.NET 应用程序,我使用静态类作为缓存。该静态类内部是内部字典,其中包含缓存的对象。当然,在静态类中是像添加/删除/清除这样的方法...它看起来如下:

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();
        }
    }

还是保持第一个代码片段中的原样?

提前谢谢你。

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

你可以再实现一种方法 尝试添加

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 的代码。

只需执行两次:

cacheItems.Add(key, data);

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