【问题标题】:C# .NET Singleton life of app pool应用程序池的 C# .NET Singleton 生命周期
【发布时间】:2011-09-07 12:46:36
【问题描述】:

我想使用 HttpContent.Current.Cache 创建一个在应用程序池的生命周期内保持活动状态的单例。

我应该在哪里创建这个类以及应该如何实现它?我了解如何实现单例,但对线程和 httpcontent.current.cache 不太熟悉。

谢谢!

【问题讨论】:

标签: c# asp.net singleton application-pool


【解决方案1】:

将单例代码放在哪里并不重要。

一旦您访问instance 并初始化类型,它将在您的ApplicationDomain 的整个生命周期中保留在内存中。所以把它当作一个普通的类来使用,其余的在第一次使用时完成。

【讨论】:

    【解决方案2】:

    也许您将问题过于复杂化了?我不确定你为什么需要使用缓存。你能不能只在 App_Code 文件夹中添加一个文件来存放你的类,例如“mSingleton.cs”

    public sealed class mSingleton
    {
        static readonly mSingleton _instance = new mSingleton();
    
        public int MyVal { get; set; }
    
        public static mSingleton Instance
        {
            get { return _instance; }
        }
        private mSingleton()
        {
            // Initialize members, etc. here.
        }
    }
    

    然后它对您的所有代码和页面都是全局的,在应用程序池回收或应用程序重建之前保持状态(我不知道这是否会导致应用程序也回收 - 如果确实如此,那么它适合您无论如何标准),不需要添加到任何缓存、应用程序或会话变量中。没有杂乱的处理

    您可以在任何 aspx.cs 文件中的 page_load 上执行此操作并刷新它以查看每次计数上升以证明状态保持:

    mSingleton getMyObj = mSingleton.Instance;
    getMyObj.MyVal++;
    

    【讨论】:

    • 好的,非常感谢。这是一个 LinqtoUmbraco 数据上下文,它从缓存的 xml 文件中提取数据。显然,如果 xml 文件中有超过 500 个节点,当多个用户访问该站点并创建许多数据上下文实例时,性能会受到影响。我基本上希望为访问该站点的每个人创建一个相同的数据上下文。我想当添加或更新新数据或 xml 文件发生更改时,我将不得不重新实例化 dc……这是否会改变您的建议?此对象将由访问该站点的所有用户共享?谢谢!
    • 我个人不会缓存数据上下文,因为那里可能存在一些问题。您可以像往常一样创建单例,然后在类 init 中加载数据?添加一些不错的辅助函数来根据需要解析和查询 XML。
    • 如果文件访问是一个问题,你不希望数据上下文一直加载数据,因为它并不能真正解决问题,如果你承受着这么大的负载,它就是经常快速地加载到 RAM 中,有时可能在 RAM 中有多个相同数据的副本 - 所以你不妨硬着头皮把它留在 RAM 中一次,500 个节点根本不是很多 ram - 但你有在共享主机环境中要小心 ram
    【解决方案3】:

    我不会为此使用缓存。我推荐使用静态 getInstance() 的静态类或单例。

    【讨论】:

    • 我会在模板化的静态类中使用 ConcurrentDictionary(假设它是您想要缓存的一堆数据)。如果您希望数据停留超过 29 小时,请确保关闭应用程序池回收(我相信这是默认设置)。
    • Jordan 是正确的,静态类或单例将是线程安全的,直到你试图让它做一些事情。例如,您可以以非线程安全的方式将数据存储在对象中。一个线程安全的数据结构或几个放置良好的锁块,你就准备好了;)
    • 好的,非常感谢。这是一个 LinqtoUmbraco 数据上下文,它从缓存的 xml 文件中提取数据。显然,如果 xml 文件中有超过 500 个节点,当多个用户访问该站点并创建许多数据上下文实例时,性能会受到影响。我基本上希望为访问该站点的每个人创建一个相同的数据上下文。我想当添加或更新新数据或当 xml 文件更改时,我将不得不重新实例化 dc……这是否会改变您的建议?
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多