帮忙解释一下,他为什么这么写,关于Enterprise Library中Caching Application Block中的部分!!

listhome 2005-08-09 03:53:23
这是关于添加一个对像到一个缓存中的方式
我对这段代码的疑问是
既然已用了Lock使这段代码成为临界区,为什么用要lockWasSuccessful = Monitor.TryEnter(cacheItemBeforeLock)

请高手解我心中疑问!

CacheItem cacheItemBeforeLock = null;
bool lockWasSuccessful = false;

do
{
lock (inMemoryCache.SyncRoot)
{
if (inMemoryCache.Contains(key) == false)
{
cacheItemBeforeLock = new CacheItem(key, addInProgressFlag, CacheItemPriority.NotRemovable, null);
inMemoryCache[key] = cacheItemBeforeLock;
}
else
{
cacheItemBeforeLock = (CacheItem)inMemoryCache[key];
}

lockWasSuccessful = Monitor.TryEnter(cacheItemBeforeLock);
}

if (lockWasSuccessful == false)
{
Thread.Sleep(0);
}
} while (lockWasSuccessful == false);
...全文
133 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouabc 2006-05-22
  • 打赏
  • 举报
回复


mark
listhome 2005-08-11
  • 打赏
  • 举报
回复
可是他已经在Lock了!
zhongkeruanjian 2005-08-09
  • 打赏
  • 举报
回复
我的想法是这样的:

关键是lock (inMemoryCache.SyncRoot)这个范围的问题。Cache在对CatchItem进行操作的时候,不想对整个inMemoryCache进行同步锁定,这个粒度太大,太浪费资源。

仅仅是估计。。呵

对了,你也在研究这东东么?我也是地。我的blog是
zhongkeruanjian.cnblogs.com


lyb_abiandbel 2005-08-09
  • 打赏
  • 举报
回复
星提问,我们只能顶啊!
listhome 2005-08-09
  • 打赏
  • 举报
回复
listhome 2005-08-09
  • 打赏
  • 举报
回复
看来分送不出去了,五点结贴!

有用过Enterprise Library1.0的进来接个分!
listhome 2005-08-09
  • 打赏
  • 举报
回复
又看了一遍代码,感觉我猜的差不多!!

有没有回贴的兄弟一起聊聊!!!
listhome 2005-08-09
  • 打赏
  • 举报
回复
难道是怕别的代码块在另一个线程中访问了cacheItemBeforeLock?

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧