【发布时间】: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() 永远不会执行。
【问题讨论】:
-
Stackoverflow 上有一个类似的问题/答案What is the best way to lock cache in asp.net?