gpt4 book ai didi

c# - 应用程序与缓存 : Lock mechanism

转载 作者:太空狗 更新时间:2023-10-29 21:35:26 25 4
gpt4 key购买 nike

asp.net中的Application类有Lock机制来支持线程安全。

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

样本:

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

好的。

但是

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

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

最佳答案

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

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

我认为没有理由在 Cache 对象上使用 Application

示例:假设您在缓存中有一百个项目,并且您有一个项目要存储在缓存中(如果它不在缓存中)。当您使用 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() 抛出异常,您的锁将被释放而不会出现任何问题,让其他线程继续执行。

关于c# - 应用程序与缓存 : Lock mechanism ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10268555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com