在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法

作者:shichen2014 时间:2022-11-08 10:05:09 

本文较为详细的讲述了在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 = "客户信息列表";
}

运行如下图所示:

在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法

标签:WCF,缓存,Winform,中文,速度
0
投稿

猜你喜欢

  • Dubbo实现分布式日志链路追踪

    2023-08-23 21:00:54
  • 详解使用Spring的BeanPostProcessor优雅的实现工厂模式

    2023-01-14 02:15:53
  • WPF使用Geometry绘制几何图形

    2023-08-14 14:13:31
  • 递归出现栈溢出stackoverflow的问题及解决

    2023-01-29 16:36:10
  • Java使用条件语句和循环结构确定控制流(实例)

    2022-07-04 04:52:35
  • Java优秀类库Hutool使用示例

    2021-12-09 18:12:06
  • C#实现图形界面的时钟

    2022-10-03 15:10:50
  • Java8新特性之接口中的默认方法和静态方法

    2021-08-21 07:25:43
  • JAVA及相关字符集编码问题研究分享

    2022-05-16 20:33:08
  • 在Java中将double转换为int的操作方法

    2023-03-25 16:03:40
  • 完美解决PermGen space异常的问题

    2023-08-19 07:54:55
  • 如何在C#中使用只读的 Collections

    2023-02-11 11:29:06
  • Java CAS操作与Unsafe类详解

    2023-06-15 10:06:49
  • java利用easyexcel实现导入与导出功能

    2022-09-29 06:40:16
  • java可以作为第一门编程语言学习吗

    2021-05-25 07:52:37
  • Android实现京东首页效果

    2023-10-16 23:10:10
  • eclipse怎么引入spring boot项目插件的方法

    2021-07-23 20:38:54
  • Android使用线程获取网络图片的方法

    2023-05-28 22:29:28
  • SpringMVC实现注解式权限验证的实例

    2021-11-19 11:52:44
  • C#中Lambda表达式的三种写法

    2022-03-27 02:50:27
  • asp之家 软件编程 m.aspxhome.com