Application类在asp.net中具有支持线程安全的Lock机制。
正如我们所知,Application可以在全球范围内访问。
样本:
Application.Lock();
Application["MyCode"] = 21;
Application.UnLock();好的。
但
此外,Cache是全局可访问的(并且没有锁定机制,也用于删除/添加项)
那么,为什么Application有一个锁机制而Cache没有呢?
发布于 2012-04-22 14:59:14
Application是旧的ASP技术遗留下来的数据存储。它只有一个全局锁。当您调用Application.Lock()时,所有线程中对应用程序对象的所有访问都会被阻塞。
另一方面,与ASP.NET一起引入的较新的ASP.NET对象允许您使用自己的锁定语义。您可以使用.NET的lock语句确保线程安全地访问缓存对象,同时尽可能保持web应用程序的并行性。lock语句要安全得多,因为当您退出lock块时,可以保证释放锁。应用程序对象不能保证这一点。缓存还提供了自动过期机制,这些机制更适合于缓存。它还可以根据依赖关系契约和可选优先级过期密钥,这当然是Application对象所缺乏的。
我认为没有理由在Cache对象上使用Cache。
示例:假设缓存中有100个项,如果缓存中还没有条目,则需要在缓存中存储一个项。当您使用Application时,您可以这样做:
if(Application["someData"] == null)
{
Application.Lock();
if(Application["someData"] == null)
{
Application["someData"] = getValue(); //a very long time consuming function
}
Application.Unlock();
}在这个场景中,所有对Application对象的访问都被阻止,即使它们完全无关。如果getValue()导致异常,您的应用程序就会挂起,因为锁没有释放。你需要把try.finally包起来,以确保它是安全的。
另一方面,在使用Cache对象时,您可以这样做:
if(Cache["someData"] == null)
{
lock(myLockObject) // or other shared lock for that single value
{
if(Cache["someData"] == null)
{
Cache["someData"] = getValue();
}
}
}在这种情况下,只有需要访问myLockObject的代码块才会等待。其他访问Cache的用户则可以并行运行。如果getValue()抛出异常,则释放锁,不会出现任何问题,让其他线程继续执行。
https://stackoverflow.com/questions/10268555
复制相似问题