WinForms, , . [ProjectName].Properties.Resources.
, ; 10 Form 1+ GB . ResourceManager.GetObject. GetObject , .
, , , Form? CachedResourceMananger GetObject GetObject .
public class CachedResourceManager : System.Resources.ResourceManager
{
private Hashtable objectCache = new Hashtable();
public CachedResourceManager(Type resourceSource) : base(resourceSource)
{
}
public CachedResourceManager(string baseName, Assembly assembly) : base(baseName, assembly)
{
}
public CachedResourceManager(string baseName, Assembly assembly, Type usingResourceSet) : base(baseName, assembly, usingResourceSet)
{
}
public CachedResourceManager() : base()
{
}
public override object GetObject(string name)
{
return GetObject(name, null);
}
public override object GetObject(string name, CultureInfo culture)
{
var obj = objectCache[name];
if (obj == null)
{
objectCache[name] = base.GetObject(name, culture);
obj = objectCache[name];
}
return obj;
}
}
Then I changed the property and resource manager field in automatically generated [ProjectName].Properties.Resourcesto use my own resource manager, replacing global::System.Resources.ResourceManagerwith CachedResourceManager.
internal class Resources
{
private static CachedResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static CachedResourceManager ResourceManager
{
get {
if (object.ReferenceEquals(resourceMan, null))
{
CachedResourceManager temp = new CachedResourceManager("Project.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
}
This significantly reduced memory usage and also significantly reduced the loading time for new instances of forms.
source
share