保持/缓存数据集以在桌面应用程序上重用的最佳方法

时间:2016-08-18 13:04:50

标签: c# asp.net vb.net caching dataset

我有一个Web服务,它在打开应用程序时将数据集返回给客户端桌面应用程序,不会将任何内容发送回数据库。 桌面应用程序需要此数据集的整个生命周期

将此数据集保留在内存中的最佳方法是什么,比如ASP.net中的缓存?

是否有可能将其保留为XML并在应用程序查找数据时将其恢复?

这是一个提供给客户端应用程序的产品列表,产品列表全局从Web应用程序更新,因此如果客户端需要最新数据,那么有从Web检索的方法,但基本上只有一次加载在启动期间应用程序并继续使用它但有9,000行我担心应用程序性能和内存,不确定9,000行数据集将消耗多少内存

非常感谢示例代码

1 个答案:

答案 0 :(得分:1)

您想使用缓存旁边模式。

基本上,它提供了一种众所周知的方法来将具体对象放入缓存中......使用过期策略(不要重新发明轮子,使用可用的东西)。

模式说“给我缓存中的内容......如果它不在那里,这是真正的方法来填充对象”。

您可以在瘦客户端上运行以下代码,如果我有“新的ClaimsPrincipal”,您可以调用Web服务并获取所需的数据。

https://msdn.microsoft.com/en-us/library/dn589799.aspx

https://blog.cdemi.io/design-patterns-cache-aside-pattern/

以下是一个例子:

   public class PrincipalMemoryCacheAside // : IPrincipalCacheAside
    {
        public const string CacheKeyPrefix = "PrincipalMemoryCacheAsideKey";

        public ClaimsPrincipal GetTheClaimsPrincipal(string uniqueIdentifier)
        {
            string cacheKey = this.GetFullCacheKey(uniqueIdentifier);
            ClaimsPrincipal cachedOrFreshPrincipal = GetFromCache<ClaimsPrincipal>(
                cacheKey, 
                () =>
                {
                    ClaimsPrincipal returnPrinc = null;

                    /* You would go hit your web service here to populate your object */
                    ClaimsIdentity ci = new GenericIdentity(this.GetType().ToString());
                    ci.AddClaim(new Claim("MyType", "MyValue"));
                    returnPrinc  = new ClaimsPrincipal(ci);


                    return returnPrinc;
                });

            return cachedOrFreshPrincipal;
        }

        private TEntity GetFromCache<TEntity>(string key, Func<TEntity> valueFactory) where TEntity : class
        {

            ObjectCache cache = MemoryCache.Default;
            //// the lazy class provides lazy initializtion which will evaluate the valueFactory expression only if the item does not exist in cache
            var newValue = new Lazy<TEntity>(valueFactory);
            CacheItemPolicy policy = new CacheItemPolicy { SlidingExpiration = new TimeSpan(0, 60, 0), Priority = CacheItemPriority.NotRemovable };
            ////The line below returns existing item or adds the new value if it doesn't exist
            var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<TEntity>;
            return (value ?? newValue).Value; // Lazy<T> handles the locking itself
        }

        private string GetFullCacheKey(string uniqueIdentifier)
        {
            string returnValue = CacheKeyPrefix + uniqueIdentifier;
            return returnValue;
        }
    }