• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

帮忙解释一下,他为什么这么写,关于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);
...全文
106 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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?
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2005-08-09 03:53
社区公告

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