在.NET应用程序中"重置"所有静态变量的最佳方法

max*_*axp 3 c# asp.net static-members

除了可怕之外,如果我有一个.NET webapp,其中静态变量分散在多个类中,那么最好的方法是将它们全部"清除"为null.

在我的头顶,它将是使用重新启动应用程序

System.Web.HttpRuntime.UnloadAppDomain() 
Run Code Online (Sandbox Code Playgroud)

问题背后的原因 - 我们正在缓存一些非常大的字典集合,这些集合的创建成本很高,并且在奇怪的情况下需要重置.

Mar*_*ell 5

卸载听起来最简单,但你不想经常这样做; 坦率地说,我会非常怀疑这样做的常规要求.

如果你想在没有卸载的情况下这样做,你必须根据具体情况来了解其含义.特别是,通过静态构造函数/类型初始值设定项/静态字段初始值设定项强制将某些内容设置为null可能会彻底破坏您的应用程序.

请注意,静态变量很少适用于Web应用程序,除了缓存(然后必须小心管理).

如果您确实拥有这样的数据,而不是多个静态变量,您可能会查看作为伪单例的状态类的实例变量 - 那么您只有一个引用来交换每个数据簇.

东西可能是值得考虑的某处有一个事件,静态代码可以订阅一次只在需要的时候自己初始化时,则触发事件,即

myStaticData = new SomeExpensiveThreadSafeCacheDictionary();
GlobalKillSwitch.ResetCache += delegate { myStaticData.Clear(); };
Run Code Online (Sandbox Code Playgroud)

  • @SkonJeet因为Web应用程序正在处理许多请求; 请求中使用的大多数数据都是特定于该请求的,并且您不希望它靠近可能影响其他请求的静态字段.当你**使用静态字段时,你需要考虑线程安全性(多个竞争无关的请求,以及在管道期间在不同线程之间跳转的单个请求).不要误会我的意思:他们有用......但是:有很多警告 (2认同)