6

Applicationasp.net 中的类具有Lock支持线程安全的机制。

正如我们所知 -Application可以全局访问。

样本 :

Application.Lock();
Application["MyCode"] = 21;
Application.UnLock();

行。

也是Cache全局可访问的(并且没有锁定机制,也用于删除/添加项目)

那么为什么Application会有锁定机制而Cache没有呢?

4

1 回答 1

6

Application是旧 ASP 技术遗留下来的数据存储。它有一个全局锁。当您调用Application.Lock()所有线程中对 Application 对象的所有访问时,都会被阻止。

另一方面Cache,ASP.NET 引入的较新对象允许您使用自己的锁定语义。您可以使用 .NET 的lock语句来确保对 Cache 对象的线程安全访问,同时保持您的 Web 应用程序尽可能并行。该lock语句要安全得多,因为当您退出lock块时,可以保证释放锁。应用程序对象不保证这一点。缓存还提供了自动过期机制,它更适合缓存。它还可以根据应用程序对象当然缺少的依赖合同和可选优先级来使密钥过期。

我认为没有理由使用Applicationover Cacheobject。

示例:假设您在缓存中有一百个项目,并且您有一个项目要存储在缓存中,如果它不存在的话。当你使用 时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();
        }
    }
}

In this case only code blocks which require access to myLockObject would be waiting. Others which access to Cache would be running in parallel just fine. And in case getValue() throws an exception your lock is released without any issues letting other threads continue execution.

于 2012-04-22T14:59:14.683 回答