2

我相信这是一种常见情况,但无法通过谷歌搜索找到令人满意的答案。

问题:是否有一种模式可以解决从数据库中查找枚举值的问题?

情况:我的任务是重构一个在内存使用上变得非常沉重的 Winforms 应用程序。罪魁祸首是一个“常量”项目——基本上是一堆枚举类。它们的目的是复制数据库查找表值(参见下面的示例)。

    public enum Status
    {
        None = -1,
        Active = 0,
        Completed = 1,
        Review = 2,
        Proceed = 3
    }

每次应用加载时,所有这些枚举都必须加载到内存中。是否有一种模式可以让您解决这个问题,但也不会用查询杀死数据库?

4

1 回答 1

1

虽然很难相信enums 的程序集确实是高内存使用的主要来源(我什至不想想象该程序集的大小),但一些可能的解决方案浮现在脑海中:

  1. enum探索除enums之外的内存贪婪程序集。是的,这是一个微不足道的建议,但它毕竟可以证明是最合理的。
  2. enum将您的程序集与主项目合并。虽然enums 本身几乎不消耗内存,但相关的超大程序集很可能完全由它自己来处理(例如,由于大量使用属性)。
  3. 用一堆不必要的类实现必要的值static,填充一堆public static readonly int字段(不是consts)。如果所有这些都至少调用一次,几乎不会减少内存使用量,但可能会根据用户的操作导致一些减少。然而,那些讨厌int的 s 更难解释 then enums。
  4. 使用缓存的单例模式实现必要的值(也许这种模式有一个名称,但我不熟悉它)。虽然在每个实例的基础上显然更难使用内存,但它允许(虽然取决于 GC)被投入使用并根据使用情况将其淘汰。基本上,它应该类似于

    internal abstract class ErzatsEnumBase {
        protected static readonly ObjectCache Cache = MemoryCache.Default;
        protected ErzatsEnumBase ( string CacheKey, CacheItemPolicy CachePolicy ) {
            Cache.Add ( CacheKey, this, CachePolicy, null );
        }
    }
    public sealed class ErzatsEnum: ErzatsEnumBase {
        private static CacheItemPolicy policy = new CacheItemPolicy () {
            AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration,
            SlidingExpiration = new TimeSpan ( 0, 15, 0 )
        };
        private ErzatsEnum ( string CacheKey )
            : base ( CacheKey, policy ) {
        }
        public ErzatsEnum Instance1 {
            get {
                ErzatsEnum result = ErzatsEnumBase.Cache.Get ( "Instance1" );
                if ( result == null )
                   result = new ErzatsEnum ( "Instance1" );
                return result;
            }
        }
        public ErzatsEnum Instance2 {
            get {
                ErzatsEnum result = ErzatsEnumBase.Cache.Get ( "Instance2" );
                if ( result == null )
                   result = new ErzatsEnum ( "Instance2" );
                return result;
            }
        }
    }
    

希望其中一些被证明是有用的:)

于 2013-09-27T19:53:22.693 回答