English 中文(简体)
ASP.NET 的 lock() 不起作用。
原标题:
  • 时间:2009-01-27 20:15:27
  •  标签:

i try to put a lock to a static string object to access to cache,, the lock() block executes in my local,but whenever i deploy it to the server, it locks forever. i write every single step to event log to see the process and lock(object) just causes the deadlock on the server. The command right after lock() is never executed as the i dont see an entry in the event log. below is the code:

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

全局.事件记录器.写入("GetUsers() 已锁定同步对象"); ==> 这从未被写入日志,这意味着lock()从未被执行。

最佳回答

你正在锁定一个字符串,这对于.NET来说通常是个不好的选择,因为它可能会被interning。.NET运行时实际上只会存储所有相同的文字字面值一次,因此你无法控制谁能看到特定的字符串。

我不确定ASP.NET运行时如何处理这个问题,但是普通的.NET运行时实际上使用了统一性来处理整个过程,这意味着统一的字符串即使在不同的AppDomains之间也是共享的。因此,你可能会在你方法的不同实例之间出现死锁。

问题回答

如果你使用了什么会发生:

public static object CacheSyncObject = new object();




相关问题
热门标签