【问题标题】:How long does the ConcurrentDictionary object last?ConcurrentDictionary 对象持续多长时间?
【发布时间】:2018-04-04 16:40:47
【问题描述】:

我在 Azure 应用服务上使用 MVC 5、ASP.NET 4.7

我正在使用 ConcurrentDictionary 对象来持久化数据以保存对数据源的多次调用。

关于其行为的几个问题:

1) 一旦它被填充,那么它将持续存在,供同一个 Web 应用程序的多个用户访问。我对么?因此,只有网站重新启动后的第一个用户会受到性能影响。

2) 它会持续多久?是直到另一个池刷新或站点重新启动,还是存在某种形式的非活动超时?

提前致谢。

编辑:

public class myCache
{
    private static readonly ConcurrentDictionary<int, string> myCacheDictionary = new ConcurrentDictionary<int, string>();

    public static async Task populateCache()

【问题讨论】:

  • 取决于变量的范围等。向我们展示您的代码。
  • 我明白你在说什么。因此,在我的情况下,它被创建为类中的私有变量,因此只要该类被实例化,它就存在。我认为出于某种奇怪的原因它仍然存在于进程之外,即使调用对象已被释放。
  • 它是静态的,因此一旦执行了该类型的静态构造函数,它将在应用程序域的整个生命周期内持续存在。

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

1) 一旦它被填充,它将持续存在,供同一个 Web 应用程序的多个用户访问。我对么?因此,只有网站重新启动后的第一个用户会受到性能影响。

是的,static 关键字意味着只要应用程序在内存中,它就会一直保留,除非您以编程方式将其清除。无论用户、线程、同步上下文等如何,每个请求都将使用相同的实例。

2) 它会持续多久?是直到另一个池刷新或站点重新启动,还是存在某种形式的非活动超时?

它会一直存在,直到应用程序池刷新或站点重新启动,除非您以其他方式对其进行编程。

如果您将 MemoryCache 类用于缓存目的,您可能会对它感兴趣。它可以让您设置策略以在特定时间后清除其数据,或者当它检测到您的内存开始不足时。

【讨论】:

  • 这里有趣的挑战是何时更新它,因为它实际上是从 REST API 调用中填充的。数据是相当静态的,我相信 Azure 应用程序池在应用服务内的不同虚拟机上经常刷新,因此这可能会强制定期重新填充。
【解决方案2】:

如果字典确实是一个静态类级别的字段,那么它将与应用程序池一样长。它在同一个应用程序池中的用户之间共享。

列表是否只填充一次取决于您调用填充方法的方式。我建议正确锁定或使用Lazy&lt;T&gt;(使用正确的构造函数)以确保排他性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2021-02-12
    • 2010-12-03
    • 2011-06-06
    相关资源
    最近更新 更多