c# - 锁定 String.Format()

标签 c# string locking format

我正在 asp.net mvc 应用程序中实现缓存,为了防止刷新缓存时查询多次运行,我在任何数据库访问代码周围使用了锁。

由于我对每条数据都有一个唯一的缓存键,因此我认为锁定该字符串可能是一个好主意。但有时要获取的数据对于特定用户来说是唯一的(例如用户 X 编写的所有评论),因此我使用 String.Format() 将用户的 id 放入缓存键中。

这是一个例子:

    private const string cacheKey = "blog_comments_from_specific_user-{0}";

    private List<Comments> GetCommentsFromuser(int userId)
    {
        if (GetCache(String.Format(cacheKey, userId)) == null)
        {
            lock (String.Format(cacheKey, userId))
            {
                if (GetCache(String.Format(cacheKey, userId)) == null)
                {
                    // get data from database
                }
            }
        }
    }

我希望数据库代码对每个唯一的字符串内容仅运行一次,但我不确定这是否就是它正在做的事情。我还没有找到测试它的方法。我读到有一个 String.Intern() 方法可以锁定特定的字符串内容,但我是否也需要它,或者 String.Format() 足够了吗?

最佳答案

不要锁定字符串。它们具有微妙的行为(实习、应用程序域重用、在其他位置的不可预测的使用),这使得它们不适合这样做。如果您想要按键锁定,请创建一个键(字符串)的字典(或类似的;Hashtable 具有更好的线程语义,但不是通用的)来锁定对象(可能只是 new 对象) ())。

关于c# - 锁定 String.Format(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23008128/

相关文章:

PHP:将变量添加到 json_decode 中

c# - 我应该使用不同的对象来锁定每个属性吗?

c# - 从任务更新一个 int 变量?

c# - 自定义 IEnumerable 实现无法使用 IEnumerable 进行设置

c# - 重用 try catch 进行 wcf 调用

c# - ASP.NET Identity UserManager UpdateAsync 删除角色

c - 返回类型为 void 的函数

java - 为什么 Java 允许将字符串文字分配给 String 对象?

mysql - 如何在 mysql (innodb) 中查看全局锁?

c# - Windows 服务中的重叠任务