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

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

运行如下图所示:

(0)

相关推荐

  • 加快Windows 2000访问网上邻居的速度

    在部分机器的Windows 2000中打开"邻近的计算机",常常会等上几十秒的时间,让人无法忍受.仔细分析会发现,在找到的计算机当中,包括"打印机"和"任务计划"两项.通过"网上邻居"浏览计算机时,Windows 2000会先搜索自己的共享目录.可作为网络共享的打印机以及"任务计划"中与网络有关的计划任务,这势必会影响到浏览速度.所以,应该取消搜索"打印机"和"任务计划&quo

  • js 利用image对象实现图片的预加载提高访问速度

    大量采用高解析度的图像的确可以让一个Web站点容光焕发.但同样也会造成站点访问速度下降--图片是文件,文件就要占用带宽,而带宽直接同访问等待时间相关.现在,让我们来学习一种名为图像预装载(image preloading)的小技巧来提高图像访问速度. 一些浏览器试图通过在本地缓存中保存这些图片来解决此问题.这样一来可以顺序调用这些图片--但对于首次使用这些图片的时候仍然会存在延时.预装载就是一种在需要图片之前就将图片下载到缓存的技术.采用这样的方式可以使当确实需要显示图片时迅速将其从缓存中恢复回

  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法. 1.修改mysql数据库链接地址为ip地址127.0.0.1. 2.使用最新版本,这个坑了我好久时间. 下面一段内容是关于phpstudy启动失败的解决办法. php5.3.5.4和apache都是用vc9编译,电脑必须安装vc9运行库才能运行. php5.5.5.6是vc11编译,如用php5.5.5.6必须安装vc11运行库. vc9和vc11运行库下载:http://pan.baidu.com/s/1gd0y1Qb php5.5以上才有

  • 如何提高数据访问速度

    hasOwnProperty()仅检索实例不检索原型,in即检索实例,又检索原型 成员嵌套越深,访问速度越慢,只在必要的情况下使用对象成员. 如果在同一个函数中你要多次读取同一个对象属性,最好将它存入一个局部变量.以局部变量替代属性,避免多余的属性查找带来性能开销. 直接量和局部变量访问速度非常快,数组项和对象成员需要更长时间. 局部变量比域外变量快,因为它位于作用域链的第一个对象中.变量在作用域链中的位置越深,访问所需的时间就越长.全局变量总是最慢的,因为它们总是位于作用域链的最后一环. 避免

  • asp页面提高的访问速度的方法详解

    技巧之一:提高使用Request集合的效率 访问一个ASP集合来提取一个值是费时的.占用计算资源的过程.因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多.因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量.例如将代码写成下面的形式以加快脚本引擎处理速度: 复制代码 代码如下: strTitle=Request.Form("Title")strFirstName=Request.Form("FirstName&quo

  • 几种延迟加载JS代码的方法加快网页的访问速度

    本文介绍了如何延迟javascript代码的加载,加快网页的访问速度. 当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点: 1.延迟加载js代码 复制代码 代码如下: <script type="text/javascript" src="" id="my"></script> <script type="text/

  • Nginx服务器限制访问速度的配置方法

    用Nginx建站的同学,常会有限速需求.开发测试阶段在本地限速模拟公网的环境,方便调试.投入运营会有限制附件下限速度,限制每个用户的访问速度,限制每个IP的链接速度等需求. 刚遇到一个Bug在网络很卡的情况下才能重现,本地调试访问本机速度太快,配置Nginx成功达到限速目的,在此分享出来. 配置简单,只需3行,打开"nginx根目录/conf/nginx.conf"配置文件修改如下: http{ -- limit_zone one $binary_remote_addr 10m; --

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

    本文较为详细的讲述了在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法,分享给大家供大家参考之用.具体方法如下: 在我们开发基于WCF访问方式的Winform程序的时候,一般情况下需要对界面显示的字段进行中文显示的解析.如果是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,但是不建议这样处理:一般情况下,我们把中文对照信息放到业务类里面去统一解析,但是这样会导致每次WCF访问方式请求解析中文化的操作耗费一定的响应时间.如果使用缓存存储中文字段的对照表,那么

  • 详解AngularJS中$http缓存以及处理多个$http请求的方法

    $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据.在AngularJS的实际项目中,经常需要处理多个$http请求,每个$http请求返回一个promise,我们可以把多个promise放到$q.all()方法接受的一个数组实参中去. 1.处理多个$http请求 angular.module('app',[]) .controller('AppCtrl', function AppCtrl(myService){ var app = this; myService.

  • Memcached缓存系统的介绍、安装以及应用方法详解

    本文实例讲述了Memcached缓存系统的介绍.安装以及应用方法.分享给大家供大家参考,具体如下: 一. memcached 是什么? memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database loa

  • ASP.NET2.0中数据源控件之异步数据访问

    在第 1 部分和第 2 部分中,建立了 WeatherDataSource 控件,该控件针对 weather.com(英文)所提供的 XML API 来运行,使用 WebRequest 和 WebResponse 来通过 HTTP 访问数据.迄今为止,均是同步访问该服务.因此,页面处理被阻止,直到 Web 请求完成为止.此方法对于测试页面是有效的,在小站点上也可能有效,但是在接收大量通信流量的站点上则会惨败:例如门户页面,天气模块在其中可能非常常见. 引言 在线程池中有固定不变的大量线程可用于服

  • 在ASP.NET 2.0中操作数据之一:创建一个数据访问层

    导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研究在ASP.NET 2.0中实现这些常见的数据访问模式之技术的长篇系列教程的第一篇.我们将从创建一个软件框架开始,这个框架的组成部分包括一个使用强类型的DataSet的数据访问层(DAL),一个实施用户定义的业务规则的业务逻辑层(BLL),以及一个由共享页面布局的ASP.NET网页组成的表现层.在打下这个后端的基础工作之后,我们将开始转向报表,示范如何显示,汇总

  • SpringBoot中Mybatis + Druid 数据访问的详细过程

    目录 1.简介 2.JDBC 3.CRUD操作 4.自定义数据源 DruidDataSource 1.配置 Druid 数据源监控 2.配置 Druid web 监控 filter 5.SpringBoot 整合mybatis 1. 导入mybatis所需要的依赖 2.配置数据库连接信息 3,创建实体类 4.配置Mapper接口类 6.SpringBoot 整合 1.简介 ​ 对于数据访问层,无论是SQL(关系型数据库) 还是NOSQL(非关系型数据库),SpringBoot 底层都是采用 Sp

  • PHP中关于PDO数据访问抽象层的功能操作实例

    PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PDO对象 $dsn ="mysql:dbname=mydb;host=localhost";//数据库类型:dbname=数据库名称;host=链接的ip或本机 $pdo =new PDO($dsn,"root","root");//$dsn,帐号,密

  • Java的Spring框架中DAO数据访问对象的使用示例

    Spring DAO之JDBC   Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术, 如JDBC,Hibernate或者JDO等.它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常. 为了便于以一种一致的方式使用各种数据访问技术,如JDBC.JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展.这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其

  • 充分利用ASP.NET的三种缓存提高站点性能的注意方法

    ASP.NET提供三种主要形式的缓存:页面级输出缓存.用户控件级输出缓存(或称为片段缓存)和缓存API. 尽早缓存:经常缓存  您应该在应用程序的每一层都实现缓存.向数据层.业务逻辑层.UI或输出层添加缓存支持.内存现在非常便宜-因此,通过以智能的方式在整个应用程序中实现缓存,可以获得很大的性能提高. 页面级输出缓存 最简单的缓存形式,只是在内存中保留为响应请求而发送的HTML的副本. 要实现页面输出缓存,只要将一条OutputCache指令添加到页面即可. <%@ OutputCache Du

  • PHP中文件缓存转内存缓存的方法

    前言 顾名思义文件缓存转内存缓存就是将存储在文件中的数据转到内存中去,实现磁盘操作转为内存操作,这样可以大大提高数据访问速度,并能实现缓存数据的分布式部署.文件缓存与内存缓存的介绍请参考名词解释部分. 原理 文件缓存转内存缓存的原理就是把文件缓存中的数据转存到内存中,以实现数据全局共享,解决频繁加载文件和装载数据的问题,采用Memcache工具实现内存缓存数据. 实现机制与步骤 1,检查文件是否存在内存缓存,如果不存在加载缓存文件 2,加载缓存文件,并获取缓存文件中的数据 3,将缓存文件中的数据

随机推荐