除了可怕之外,如果我有一个 .NET webapp,它的静态变量分散在多个类中,那么将它们全部“清除”回 null 的最巧妙方法是什么。
在我的脑海中,这将是使用重新启动应用程序
System.Web.HttpRuntime.UnloadAppDomain()
问题背后的原因 - 我们正在缓存一些非常大的 Dictionary 集合,这些集合的创建成本很高,并且偶尔需要重置。
除了可怕之外,如果我有一个 .NET webapp,它的静态变量分散在多个类中,那么将它们全部“清除”回 null 的最巧妙方法是什么。
在我的脑海中,这将是使用重新启动应用程序
System.Web.HttpRuntime.UnloadAppDomain()
问题背后的原因 - 我们正在缓存一些非常大的 Dictionary 集合,这些集合的创建成本很高,并且偶尔需要重置。
卸载听上去是最简单的方法,但你不想经常这样做;坦率地说,我会非常怀疑这样做的任何常规要求。
如果您想在不卸载的情况下执行此操作,则必须逐个查看以了解其含义。特别是,将静态构造函数/类型初始化程序/静态字段初始化程序设置为值的内容强制设置为 null 可能会彻底破坏您的应用程序。
请注意,静态变量很少适用于 Web 应用程序,也许缓存除外(然后必须小心管理)。
如果您确实有这样的数据,而不是多个静态变量,您可能会查看状态类上的实例变量,这有助于作为伪单例 - 那么您只有一个引用来交换每个数据集群。
可能值得考虑的事情是在某个地方有一个事件,静态代码只能在初始化自己时订阅一次,然后在需要时触发事件,即
myStaticData = new SomeExpensiveThreadSafeCacheDictionary();
GlobalKillSwitch.ResetCache += delegate { myStaticData.Clear(); };
我用这个
public static void ResetAllStaticsVariables(Type type)
{
var fields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Public);
foreach (var fieldInfo in fields)
{
fieldInfo.SetValue(null, GetDefault(type));
}
}
public static object GetDefault(Type type)
{
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}