【问题标题】:ASP.NET lock() doesn't workASP.NET lock() 不起作用
【发布时间】:2010-10-03 20:34:51
【问题描述】:

我尝试锁定静态字符串对象以访问缓存,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() 永远不会执行。

【问题讨论】:

标签: asp.net caching locking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果你使用会发生什么:

    public static object CacheSyncObject = new object();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多