当前位置:  开发笔记 > 后端 > 正文

ASP.NET lock()不起作用

如何解决《ASP.NETlock()不起作用》经验,为你挑选了1个好方法。

我试图锁定一个静态字符串对象来访问缓存,lock()块在我的本地执行,但每当我将它部署到服务器时,它就永远锁定.我将每一步写入事件日志以查看进程并且锁定(对象)只会导致服务器上的死锁.lock()之后的命令永远不会执行,因为我在事件日志中看不到条目.以下是代码:

public static string CacheSyncObject = "CacheSync";
public static DataView GetUsers()
{

    DataTable dtUsers = null;
    if (HttpContext.Current.Cache["dtUsers"] != null)
    {
        Global.eventLogger.Write(String.Format("GetUsers() cache hit: {0}",dtUsers.Rows.Count));
        return (HttpContext.Current.Cache["dtUsers"] as DataTable).Copy().DefaultView;
    }

    Global.eventLogger.Write("GetUsers() cache miss");
    lock (CacheSyncObject)
    {
        Global.eventLogger.Write("GetUsers() locked SyncObject");

        if (HttpContext.Current.Cache["dtUsers"] != null)
        {
            Global.eventLogger.Write("GetUsers() opps, another thread filled the cache, release lock");
            return (HttpContext.Current.Cache["dtUsers"] as DataTable).Copy().DefaultView;
        }

Global.eventLogger.Write("GetUsers()锁定SyncObject"); ==>这永远不会写入日志,这对我来说意味着,lock()永远不会执行.



1> Brian Rasmus..:

你正在锁定一个字符串,由于实习,这在.NET中通常是个坏主意..NET运行时实际上只存储了所有相同的文字字符串一次,因此您几乎无法控制谁查看特定字符串.

我不确定ASP.NET运行时如何处理这个问题,但是常规的.NET运行时实际上使用了整个进程的实习,这意味着即使在不同的AppDomain之间也可以共享实例化的字符串.因此,您可能在您方法的不同实例之间陷入僵局.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有