亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

詳解Winform里面的緩存使用

2020-01-24 02:51:56
字體:
來源:轉載
供稿:網友

緩存在很多情況下需要用到,合理利用緩存可以一方面可以提高程序的響應速度,同時可以減少對特定資源訪問的壓力。本文主要針對自己在Winform方面的緩存使用做一個引導性的介紹,希望大家能夠從中了解一些緩存的使用場景和使用方法。緩存是一個中大型系統所必須考慮的問題。為了避免每次請求都去訪問后臺的資源(例如數據庫),我們一般會考慮將一些更新不是很頻繁的,可以重用的數據,通過一定的方式臨時地保存起來,后續的請求根據情況可以直接訪問這些保存起來的數據。這種機制就是所謂的緩存機制。

.NET 4.0的緩存功能主要由三部分組成:System.Runtime.Caching,System.Web.Caching.Cache和Output Cache。

System.Runtime.Caching這是在.NET 4.0中新增的緩存框架,主要是使用MemoryCache對象,該對象存在于程序集System.Runtime.Caching.dll。

System.Web.Caching.Cache這個則是在.NET2.0開始就一直存在的緩存對象,一般主要用在Web中,當然也可以用于Winform里面,不過要引用System.Web.dll。

Output Cache則是Asp.NET里面使用的,在ASP.NET 4.0之前的版本都是直接使用System.Web.Caching.Cache來緩存HTML片段。在ASP.NET 4.0中對它進行了重新設計,提供了一個OutputCacheProvider供開發人員進行擴展,但是它默認情況下,仍然使用System.Web.Caching.Cache來做做緩存。

1、自定義Hastable的緩存處理。
除了上面三種的緩存機制,一般我們還可以在靜態對象里面通過HashTable或者Dictionary的方式進行自定義的緩存存儲和使用。

例如我在我自己所開發的程序里面,都使用了工廠類來創建業務對象,由于創建業務對象以及數據訪問層對象,是一個在界面或者中間層反復調用的操作,因此需要把經常調用的對象把它存儲起來,下載調用的時候,直接從內存中取出來即可。如下面的BLLFactory類,就是一個基于泛型對象的業務類的創建操作,使用了基于Hashtable的靜態對象進行緩存處理。

復制代碼 代碼如下:

/// <summary>
    /// 對業務類進行構造的工廠類
    /// </summary>
    /// <typeparam name="T">業務對象類型</typeparam>
    public class BLLFactory<T> where T : class
    {
        private static Hashtable objCache = new Hashtable();
        private static object syncRoot = new Object();

        /// <summary>
        /// 創建或者從緩存中獲取對應業務類的實例
        /// </summary>
        public static T Instance
        {
            get
            {
                string CacheKey = typeof(T).FullName;
                T bll = (T)objCache[CacheKey];  //從緩存讀取 
                if (bll == null)
                {
                    lock (syncRoot)
                    {
                        if (bll == null)
                        {
                            bll = Reflect<T>.Create(typeof(T).FullName, typeof(T).Assembly.GetName().Name); //反射創建,并緩存
                            objCache.Add(typeof(T).FullName, bll);
                        }
                    }
                }
                return bll;
            }
        }
    }

2、使用.NET4.0的MemoryCache對象實現緩存

MemoryCache的使用網上介紹的不多,不過這個是.NET4.0新引入的緩存對象,估計主要是替換原來企業庫的緩存模塊,使得.NET的緩存可以無處不在,而不用基于特定的Windows版本上使用。

首先我們使用來創建一個基于MemoryCache的輔助類MemoryCacheHelper,方便調用進行緩存處理。

復制代碼 代碼如下:

/// <summary>
    /// 基于MemoryCache的緩存輔助類
    /// </summary>
    public static class MemoryCacheHelper
    {
        private static readonly Object _locker = new object();

        public static T GetCacheItem<T>(String key, Func<T> cachePopulate, TimeSpan? slidingExpiration = null, DateTime? absoluteExpiration = null)
        {
            if(String.IsNullOrWhiteSpace(key)) throw new ArgumentException("Invalid cache key");
            if(cachePopulate == null) throw new ArgumentNullException("cachePopulate");
            if(slidingExpiration == null && absoluteExpiration == null) throw new ArgumentException("Either a sliding expiration or absolute must be provided");

            if(MemoryCache.Default[key] == null)
            {
                lock(_locker)
                {
                    if(MemoryCache.Default[key] == null)
                    {
                        var item = new CacheItem(key, cachePopulate());
                        var policy = CreatePolicy(slidingExpiration, absoluteExpiration);

                        MemoryCache.Default.Add(item, policy);
                    }
                }
            }

            return (T)MemoryCache.Default[key];
        }

        private static CacheItemPolicy CreatePolicy(TimeSpan? slidingExpiration, DateTime? absoluteExpiration)
        {
            var policy = new CacheItemPolicy();

            if(absoluteExpiration.HasValue)
            {
                policy.AbsoluteExpiration = absoluteExpiration.Value;
            }
            else if(slidingExpiration.HasValue)
            {
                policy.SlidingExpiration = slidingExpiration.Value;
            }

            policy.Priority = CacheItemPriority.Default;

            return policy;
        }
    }

這個輔助類只有一個public方法,就是GetCacheItem,使用的時候,需要指定key和獲取數據的處理代理,還有緩存的過期時間,是基于TimeSpan的還是基于絕對時間的,選擇其一。

上面的輔助類,我們在什么情況下會使用到呢?

假如在一個工作流模塊中用到了人員ID,而人員ID需要進行人員名稱的轉義,人員信息我們一般知道放在權限系統模塊里面,那么如果在工作流里面需要頻繁對人員ID進行轉義,那么就需要方法調用權限系統的接口模塊,這樣處理就可以使用緩存模塊進行優化處理的了。

復制代碼 代碼如下:

void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName.Equals("ProcUser") || e.Column.FieldName.Equals("ProcUid") || e.Column.FieldName.Equals("UserId"))
            {
                if (e.Value != null)
                {
                    e.DisplayText = SecurityHelper.GetUserFullName(e.Value.ToString());
                }
            }
        }

其中的SecurityHelper.GetUserFullName是我對調用進行基于緩存的二次封裝,具體邏輯如下所示。

復制代碼 代碼如下:

/// <summary>
        /// 根據用戶的ID,獲取用戶的全名,并放到緩存里面
        /// </summary>
        /// <param name="userId">用戶的ID</param>
        /// <returns></returns>
        public static string GetUserFullName(string userId)
        {           
            string key = "Security_UserFullName" + userId;
            string fullName = MemoryCacheHelper.GetCacheItem<string>(key,
                delegate() { return BLLFactory<User>.Instance.GetFullNameByID(userId.ToInt32()); },
                new TimeSpan(0, 30, 0));//30分鐘過期
            return fullName;
        }

MemoryCacheHelper的方法GetCacheItem里面的Func<T>我使用了一個匿名函數用來獲取緩存的值。

復制代碼 代碼如下:

delegate() { return BLLFactory<User>.Instance.GetFullNameByID(userId.ToInt32()); }

而調用BLLFactory<User>.Instance.GetFullNameByID則是從數據庫里面獲取對應的數據了。

這樣在第一次或者緩存過期的時候,自動調用業務對象類的方法來獲取數據了。

最后,在界面上調用GetUserFullName的方法即可實現基于緩存方式的調用,程序第一次使用的,碰到指定的鍵沒有數據,就去數據庫里面獲取,以后碰到該鍵,則直接獲取緩存的數據了。

下面圖形是程序具體的實現效果。

當然,以上兩種方式都還可以通過AOP的注入方式實現代碼的簡化操作,不過由于對AOP的引入,會涉及到更多的知識點,而且熟悉程序還不夠,所以依然采用較為常用的方式來處理緩存的數據。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文字幕国产| 日韩av毛片网| 2019最新中文字幕| 韩剧1988免费观看全集| xxx一区二区| 91在线网站视频| 国产精品视频公开费视频| 久色乳综合思思在线视频| 国产精品视频区| 久久99热精品这里久久精品| 色综合天天狠天天透天天伊人| 日韩中文字幕视频在线观看| 久久久精品免费| 亚洲视频视频在线| xxxx欧美18另类的高清| 欧美怡红院视频一区二区三区| 国产精品入口免费视| 亚洲欧美精品伊人久久| 久久视频在线播放| 久久亚洲精品一区二区| 国产91av在线| 亚洲国产高潮在线观看| 亚洲人成亚洲人成在线观看| 国产噜噜噜噜久久久久久久久| 一区二区三区精品99久久| 久久精品青青大伊人av| 亚洲自拍偷拍第一页| 一本大道香蕉久在线播放29| 日韩av免费看网站| 色爱av美腿丝袜综合粉嫩av| 68精品久久久久久欧美| 精品福利在线观看| 成人黄色网免费| 欧美成人三级视频网站| 欧美激情视频免费观看| 国产成人福利夜色影视| www国产精品com| 亚洲欧美色图片| 成人动漫网站在线观看| 91在线精品播放| 精品人伦一区二区三区蜜桃免费| 中文字幕日韩专区| 久久97精品久久久久久久不卡| 久久久久久高潮国产精品视| 国产亚洲精品久久久久久777| 成人av资源在线播放| 国语自产精品视频在线看抢先版图片| 国产精彩精品视频| 久久久久久久久国产精品| 91免费国产视频| 久久久久久成人精品| 亚洲欧美精品在线| 美女福利视频一区| 欧美日韩人人澡狠狠躁视频| 91av视频在线播放| 国产91色在线|免| 久久精品视频在线| 日韩不卡在线观看| 国产成人avxxxxx在线看| 欧洲永久精品大片ww免费漫画| 4444欧美成人kkkk| 精品久久久免费| 亚洲成人黄色网| 91av中文字幕| 欧美理论电影在线观看| 久热精品视频在线观看一区| 97精品国产97久久久久久| 亚洲一区二区在线播放| 亚洲国产精品高清久久久| 成人av在线网址| 欧美激情精品在线| 欧美劲爆第一页| 国产99久久精品一区二区 夜夜躁日日躁| 在线a欧美视频| 亚洲a∨日韩av高清在线观看| 国产自摸综合网| 久久九九热免费视频| 国内精品久久久久久久久| 久久99热精品这里久久精品| 国产亚洲在线播放| 国产视频亚洲精品| 亚洲丁香久久久| 97欧美精品一区二区三区| 日韩欧美一区二区三区久久| 日韩暖暖在线视频| 欧美亚州一区二区三区| 美女国内精品自产拍在线播放| 欧美国产中文字幕| 欧美日韩电影在线观看| 韩剧1988在线观看免费完整版| 日韩在线免费av| 日产日韩在线亚洲欧美| 久久精品91久久久久久再现| 久久九九国产精品怡红院| 欧美日韩在线视频首页| 成人欧美一区二区三区黑人孕妇| 亚洲的天堂在线中文字幕| 日韩av在线网址| 亚洲国产精彩中文乱码av| 国产一区二区精品丝袜| 亚洲激情在线观看视频免费| 亚洲色图第三页| 亚洲国产成人av在线| 97超级碰碰人国产在线观看| 国产三级精品网站| 国产精品夜色7777狼人| 欧美激情综合色| 亚洲一区中文字幕在线观看| 亚洲国产精品久久久久久| 在线观看国产欧美| 精品国产1区2区| 亚洲欧美一区二区三区情侣bbw| 668精品在线视频| 亚洲美女视频网站| 亚洲美女视频网站| 亚洲欧美一区二区三区四区| 亚洲欧美日韩国产中文专区| 亚洲精品久久久久久下一站| 自拍偷拍亚洲一区| 亚洲男人天堂手机在线| 国产精品视频自在线| 青草青草久热精品视频在线网站| 另类美女黄大片| 国内精品久久久久影院 日本资源| 国产精品白丝jk喷水视频一区| 国产美女扒开尿口久久久| 成人精品网站在线观看| 日韩电影在线观看免费| 69av在线播放| 中文字幕国产亚洲2019| 欧美日韩一区二区精品| 中文亚洲视频在线| 亚洲国内精品在线| 成人午夜在线视频一区| 亚洲精品国产成人| 美女性感视频久久久| 日韩av电影在线网| 日韩美女在线看| 国产成人av在线| 精品久久久国产精品999| 国产成人在线亚洲欧美| 欧美国产日韩xxxxx| 久久久久这里只有精品| 国自产精品手机在线观看视频| 成人av在线亚洲| 成人激情在线播放| 亚洲午夜未满十八勿入免费观看全集| 亚洲风情亚aⅴ在线发布| 在线播放亚洲激情| 亚洲自拍偷拍第一页| 久久亚洲精品成人| 黑人巨大精品欧美一区免费视频| 日韩精品免费电影| 久久免费视频这里只有精品| 国内精品久久久久久久久| 久久在线精品视频| 亚洲人成网站999久久久综合| 成人国产精品一区| 色综合久久中文字幕综合网小说| 亚洲va久久久噜噜噜| 成人网址在线观看| 欧美中文字幕在线视频| 一区二区三区视频免费在线观看| 国产精品视频网址|