C#.NET应用程序池的单身生活

C#.NET应用程序池的单身生活,c#,asp.net,singleton,application-pool,C#,Asp.net,Singleton,Application Pool,我想使用HttpContent.Current.Cache创建一个在应用程序池生命周期内保持活动状态的单例 我将在哪里创建类以及如何实现它?我了解如何实现单例,但不太熟悉线程和httpcontent.current.cache 谢谢 我不会为此使用缓存。我建议使用静态getInstance()的静态类或单例。也许您把问题复杂化了?我不知道你为什么需要使用缓存。你能不能在App_Code文件夹中添加一个文件来存放你的类,例如“mSingleton.cs” 然后,它对您的所有代码和页面都是全局的,在

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

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


谢谢

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

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

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

您可以在任何aspx.cs文件中加载页面上执行此操作,并刷新该页面,以查看每次计数上升以证明状态保持不变:

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

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


一旦访问
实例
并初始化类型,它将在
应用程序域
的整个生命周期内保留在内存中。因此,将其作为普通类使用,其余部分在第一次使用时完成。

我将在模板化的静态类中使用ConcurrentDictionary(假设它是要缓存的一组数据)。如果您希望数据保留超过29小时(我相信这是默认设置),请确保关闭应用程序池回收。Jordan是正确的,静态类或singleton将是线程安全的,直到您尝试使其执行某些操作。例如,您可以在对象中以非线程安全的方式存储数据。一个线程安全的数据结构或几个放置良好的锁块,您就可以全部设置好了;)好的,非常感谢。这是一个LinqtoUmbraco数据上下文,它从缓存的xml文件中提取数据。显然,如果xml文件中有500多个节点,当多个用户访问该站点并创建许多datacontext实例时,性能就会受到影响。我基本上希望创建一个datacontext,对于每个访问该站点的人来说都是一样的。我想当添加或更新新数据或xml文件更改时,我必须重新实例化dc。。。这些是否改变了您的建议?实现单例模式(无需将实例放入缓存)-请参阅Jon Skeet关于如何在C#中实现它的优秀文章:好的,非常感谢。这是一个LinqtoUmbraco数据上下文,它从缓存的xml文件中提取数据。显然,如果xml文件中有500多个节点,当多个用户访问该站点并创建许多datacontext实例时,性能就会受到影响。我基本上希望创建一个datacontext,对于每个访问该站点的人来说都是一样的。我想当添加或更新新数据或xml文件更改时,我必须重新实例化dc。。。这些改变了你的建议吗?该对象将由访问该站点的所有用户共享?谢谢就个人而言,我不会缓存数据上下文,因为可能存在一些问题。您可以正常创建单例,只需在类init中加载数据?根据需要添加一些很好的帮助函数来解析和查询XML。如果文件访问是一个问题,您不希望数据上下文一直加载数据,因为它不会真正解决问题,如果您的负载太大,它会经常快速加载到RAM中,有时可能在RAM中有同一数据的多个副本-因此您不妨咬紧牙关,将其保留在RAM中一次,500个节点根本不需要太多RAM-但在共享托管环境中,您必须小心RAM
mSingleton getMyObj = mSingleton.Instance;
getMyObj.MyVal++;