我到处都读到,如果 Add 方法已经存在,它就会失败,但它会抛出异常还是会默默失败?
我正在编写一个多线程 Web 应用程序,它不应该存在,如果我覆盖缓存,将会导致问题,因此我无法使用 Insert 方法。
这是我可以做的事情吗:
try
{
HttpContext.Current.Cache.Add("notifications", notifications, null,
System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromHours(8),
System.Web.Caching.CacheItemPriority.High, null);
}
catch
{
//do whatever if notifications already exist
}
感谢您的任何答复:)
System.Web.Caching.Cache
被设计为在多线程 Web 应用程序中是线程安全的,并且多个线程可能会争用将相同的密钥添加到缓存中。所以这取决于你想如何处理这种竞争条件。
在许多情况下,您会将不可变的数据插入到缓存中,并且不会关心哪个线程“赢得”比赛。所以你可以使用Add
or Insert
.
如果您想“第一个获胜”,请使用Add
方法,如果您想要“最后一个获胜(并覆盖)”,请使用Insert
method.
在插入/添加之前检查是否存在是没有意义的。另一个线程可能会在您检查之后、尝试添加/插入之前插入该项目。
Neither Add
nor Insert
如果键已经存在,则抛出异常。这样做是没有意义的,因为缓存是为线程安全插入而设计的,无需锁定。Add
会默默地失败,并且Insert
将覆盖。
-
顺便说一句,从缓存中读取时,不要检查是否存在然后读取:
if (Cache["MyKey"] == null)
{
// ... handle missing value
}
else
{
// ... a race condition means the item may have been removed here
// before you get a chance to read it
MyType value = (MyType) Cache["MyKey"];
}
相反,从缓存中读取值并检查是否为 null:
MyType value = Cache["MyKey"] as MyType; // for reference types
if (value == null)
{
// ... handle missing value
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)