c# - 在 ASP.NET 中更新 Dictionary<T,U> 的静态方法 - 在字典本身上锁定()是否安全?

标签 c# asp.net locking thread-safety

我有一个类维护来 self 的域 Controller 的缓存查找结果的静态字典 - 用户的名字和电子邮件。

我的代码看起来像这样:

private static Dictionary<string, string> emailCache = new Dictionary<string, string>();

protected string GetUserEmail(string accountName)
{
    if (emailCache.ContainsKey(accountName))
    {
        return(emailCache[accountName]);
    }

    lock(/* something */)
    {
        if (emailCache.ContainsKey(accountName))
        {
            return(emailCache[accountName]);
        }

        var email = GetEmailFromActiveDirectory(accountName);
        emailCache.Add(accountName, email);
        return(email);
    }
}

是否需要锁?我假设是这样,因为多个请求可能会同时执行查找并最终尝试将相同的键插入到相同的静态字典中。

如果需要锁,我是否需要创建一个专用的静态对象实例来用作锁 token ,或者使用实际的字典实例作为锁 token 是否安全?

最佳答案

.NET 中的集合不是线程安全的,因此确实需要锁。使用字典的另一种方法是使用 .NET 4.0 中引入的并发字典

http://msdn.microsoft.com/en-us/library/dd287191.aspx

关于c# - 在 ASP.NET 中更新 Dictionary<T,U> 的静态方法 - 在字典本身上锁定()是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519084/

相关文章:

c# - InvalidOperationException,调用线程应该是STA,因为

c# - Oledb 阅读器无法正确读取 excel 文件

c# - 正确的处理方式 : object not disposed along all exception paths

asp.net - Html.EnumDropDownListFor 不显示所选属性值

c# - 用于浏览器兼容性的代码或 javascript

java - 对 Java 枚举值的引用是全局的吗?

c# - 为什么不能将泛型约束强制转换为其派生类型?

ios - Objective C 解析 JSON

asp.net - 如何在服务器群中实现锁定?

c++ - std::mutex 锁定顺序