本文較為詳細的講述了在WCF數據訪問中使用緩存提高Winform字段中文顯示速度的方法,分享給大家供大家參考之用。具體方法如下:
在我們開發基于WCF訪問方式的Winform程序的時候,一般情況下需要對界面顯示的字段進行中文顯示的解析。如果是硬編碼進行中文顯示,那么除了不方便調整及代碼臃腫外,性能上沒有什么問題,但是不建議這樣處理;一般情況下,我們把中文對照信息放到業務類里面去統一解析,但是這樣會導致每次WCF訪問方式請求解析中文化的操作耗費一定的響應時間。如果使用緩存存儲中文字段的對照表,那么就不用每次請求WCF的數據訪問,減少一些響應時間的消耗,提高用戶體驗效果。
1、使用硬編碼方式的中文化解析操作
硬編碼的方式,中文化字段的操作,是在本地進行的,一般響應會比較快,如下代碼所示。
public void BindData(){ #region 添加別名解析 this.winGridViewPager1.DisplayColumns = "ID,User_ID,LoginName,FullName,Note,IPAddress,MacAddress,SystemType_ID,LastUpdated"; this.winGridViewPager1.AddColumnAlias("ID", "編號"); this.winGridViewPager1.AddColumnAlias("User_ID", "登錄用戶ID"); this.winGridViewPager1.AddColumnAlias("LoginName", "登錄名"); this.winGridViewPager1.AddColumnAlias("FullName", "真實名稱"); this.winGridViewPager1.AddColumnAlias("Note", "日志描述"); this.winGridViewPager1.AddColumnAlias("IPAddress", "IP地址"); this.winGridViewPager1.AddColumnAlias("MacAddress", "Mac地址"); this.winGridViewPager1.AddColumnAlias("LastUpdated", "記錄日期"); this.winGridViewPager1.AddColumnAlias("SystemType_ID", "系統類型"); #endregion string where = GetConditionSql(); PagerInfo pagerInfo = this.winGridViewPager1.PagerInfo; List<LoginLogInfo> list = CallerFactory<ILoginLogService>.Instance.FindWithPager(where, ref pagerInfo); this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<LoginLogInfo>(list);}
只是這種方式彈性化不太好,如果字段比較多,在界面里面就有很多這樣的代碼,而且如果多處有這樣的解析,就不好控制解析字段名稱的一致性。
2、中文化統一解析操作
為了克服第一種方案的弊端,我們可以把中文化參考的操作移到底層DAL去實現,高一層的接口,只需要調用它進行解析(方法GetColumnNameAlias)就可以了。
/// <summary>/// 綁定列表數據/// </summary>private void BindData(){ this.winGridViewPager1.DisplayColumns = "HandNo,CardNo,CardStatus,CardGrade,Name,Sex,Telephone,Mobile,OpenDate,ValidateDate,Discount,Balance,MaxCount,Creator,CreateTime"; this.winGridViewPager1.ColumnNameAlias = CallerFactory<IMemberService>.Instance.GetColumnNameAlias();//字段列顯示名稱轉義 string where = GetConditionSql(); List<MemberInfo> list = CallerFactory<IMemberService>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo); this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<MemberInfo>(list); this.winGridViewPager1.PrintTitle = "會員信息報表";}
這樣處理后,解析的統一性提高了,代碼也簡化了很多,基本上達到了我們期望的效果。但是唯一的問題就是如果是WCF的數據訪問方式,那么每次訪問都會耗費一定的處理時間。
如果我們使用緩存,第二次直接從本地獲取,那么速度會提高很多,特別是表的字段參照對象比較多的時候,性能提高更加明顯。
3、使用緩存的操作處理
由于.NET提供了MemoryCache對象給我們進行緩存的處理,我們利用它就可以很好實現了,為了方便,我們可以對它進行一定的封裝后在使用。
首先,我們希望封裝后提供一個通用的對字段中文化的處理函數,傳入相應的參數就可以了。因此先封裝好一個輔助類。
/// <summary>/// 提供一些常見操作的緩存處理/// </summary>public class CacheDataUtil<T> where T : BaseEntity{ /// <summary> /// 獲取指定對象的別名 /// </summary> /// <typeparam name="T">實體類信息</typeparam> /// <param name="service">接口服務對象</param> /// <returns></returns> public static Dictionary<string, string> GetColumnNameAlias(IBaseService<T> service) { System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); string key = string.Format("{0}-{1}-{2}", method.DeclaringType.FullName, method.Name, typeof(T).Name); return MemoryCacheHelper.GetCacheItem<Dictionary<string, string>>( key, delegate() { return service.GetColumnNameAlias(); }, new TimeSpan(24, 0, 0));//24小時,即1天后過期 }}
然后在主體界面里面,我們綁定分頁控件的處理代碼如下所示即可。
/// <summary>/// 綁定列表數據/// </summary>private void BindData(){ //entity this.winGridViewPager1.DisplayColumns = displayColumns; //this.winGridViewPager1.ColumnNameAlias = CallerFactory<ICustomerService>.Instance.GetColumnNameAlias();//字段列顯示名稱轉義 //使用緩存存儲表的別名,可以有效提高二次顯示速度 this.winGridViewPager1.ColumnNameAlias = CacheDataUtil<CustomerInfo>.GetColumnNameAlias(CallerFactory<ICustomerService>.Instance);//字段列顯示名稱轉義 string where = GetConditionSql(); PagerInfo pagerInfo = this.winGridViewPager1.PagerInfo; List<CustomerInfo> list = CallerFactory<ICustomerService>.Instance.FindWithPager(where, ref pagerInfo); this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<CustomerInfo>(list); this.winGridViewPager1.PrintTitle = "客戶信息列表";}
運行如下圖所示:
新聞熱點
疑難解答