24

NFCL:Action & Func 泛型委托

 .Net Framework Class Liabrary定义了几个Action和Func的泛型委托,基本上可以满足我们常用的需求:

public delegate void Action()
public delegate void Action<T1, T2>(T1 arg1, T2 arg2)
public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3)
public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
public delegate TResult Func<TResult>()
public delegate TResult Func<T, TResult>(T arg)
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3)
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
 
需要NFX3.5,位于System.Core.dll中。
 
归类于:代码人生 标签:泛型委托 Action Func Net
21

盖茨笔记

今天比较有意思的消息就是盖茨的笔记网站开通:gatesnotes.com 
看网站下面的copyright:The Gates Notes, LLC
 
归类于:代码人生 标签:盖茨笔记
07

性能优化:累积效应

今天工作的挺投入,从上午到下午一直在调优Excel文件导入的性能。
 
一个方法执行一次可能只需要几毫秒,但如果在一个大循环里累积执行几万次,这个累积效应也是很夸张的,时间就被消耗掉了。
下午把循环里调用的每个方法、甚至一个赋值语句都单独拿出来进行测试和调优。还是发现了不少问题。
一些优化的方法:
1、尽量减少不必要的计算,可以计算一次并缓存的,就计算一次并缓存结果。
2、尽量减少不必要的赋值。场景:对一个变量进行合法校验并自动纠正,80%的情况是无需纠正的,所以无需对变量重新赋值。
3、减少转换,特别是拆箱和装箱操作。
4、检查耗时的子调用,寻找替代方法或针对性优化。
5、使用TryPrase来判断是否能正确转化,而不是用Try...Catch,减少使用Try...Catch。
。。。
 
累积效应,也可以用来做为一种调优代码的方法,能检测出那些地方存在问题,明天打算用这种方法来调调SQL。
 
归类于:代码人生 标签:性能优化 累积效应
07

Windows事件日志

.NET类库中提供了一个EventLog类,通过它你可以非常方便的读、写、删事件源和日志,并且可以注册一个事件来响应新的日志项写入事件。
 
最简单的使用方法,只需要提供一个来源,而系统默认提供了3个来源:Application, System, and Security,所以最简单的写一个消息到事件日志的方法是:EventLog.WriteEntry(string source, string message),source可以是Application或System,当然也可以使你自己创建的,Security是只读的,无法写入。
 
最快使用示例:写一个消息到Application日志。
EventLog.WriteEntry("Application","your message");
 
注意事项:
1、创建新的事件源需要管理员权限。
2、来源和日志文件是多对多的关系,可以自定义来源和日志文件。日志文件会显示在EventView的导航树上。
 
 
归类于:代码人生 标签:事件日志 eventlog
22
十二

进程间另类的通讯办法:监控文件系统(FileSystemWatcher)

项目中的一个文件解析模块需要从IIS进程中独立出来做成一个服务,所以当文件上传成功后希望IIS通知解析服务来处理文件。进程间通讯有很多方法,像Socket或MessageQueue,最开始打算用MessageQueue,但MQ也需要去做轮询,不支持事件通知方式,不太理想。
 
最后想到了通过监控目录变更来达到通知的目的,而且.NET中提供了非常简单易用的监控类:FileSystemWatcher,相关代码示例请参阅MSDN,支持变更事件通知。
 
网上搜了下,Windows Shell也提供了一个API来完成类似的功能:SHChangeNotifyRegister,并提供有代码示例,如果编写非.NET程序可以使用这个方法。
 
归类于:代码人生 标签:进程间通讯 文件系统
17
十二

2009.10.17 伯乐&博乐

收到公司邮件,公司从12月1日开始,又开放伯乐奖了,所以又想来我们公司的,可以联系我,我免费推荐^_^,公司的对大部分项目是基于MS平台的,所以只要你能熟练使用Windows系统都可以来试试
 
之前一直想弄个博乐系统,就是把好玩有趣的博文聚合一下。这周末不出去,开始弄这个玩。
 
大壮昨天没去上班在家里筹划怎么玩,不过他要是天天这样下去,估计早晚有一天先被公司玩完。
 
开始冬眠后的得瑟。
 
 
归类于:代码人生 标签:伯乐 博乐
22

ASP.NET 页面指令 之 @OutputCache

缓存的重要性就不用再强调了,@OutputCache给我们提供了一种声明的方式(对应的还有编程的方式)来控制页面和用户控件的缓存策略,这是一种最简单直接的网站优化方式。

还是先来过一遍@OutpuCache所有的属性,共用11个属性,这个指令可以用于页面(.aspx)和用户控件(.ascx)
属性
Duration
页或用户控件进行缓存的时间,单位秒,可以在页面或控件上设置该属性来建立一个缓存的过期策略,该属性是必须的。
VaryByParam
分号分割的字符串列表,是否根据某个参数变化,和VaryByControl二者必须有一。如果不变化,可将值设置为none,否则设置为*,或者变化的参数名称(Get或Post的参数)。
VaryByControl
分号分割的字符串列表,只限于用户控件,串列表的值是服务器控件标识。
Location 缓存的位置,默认是Any,该属性仅限于.aspx文件,可选项是Any,Client,Downstream,Server,None,ServerAndClient
Shared 该属性仅限于.ascx文件,默认为false,用户控件是否可以由多个页面共享。
CacheProfile 你可以在web.config中配置一个缓存设置,这样以后就可以共用这个缓存设置,方便统一修改,不支持用户控件
NoStore 这个不是太清楚什么用,MSDN上说是决定是否对敏感信息辅助存储.
VaryByContentEncodings 同样也是逗号分隔的字符串列表,根据Accept-Encodeing Http头来决定是否缓存不同的版本。
VaryByHeader 根据Http headers来决定是否进行分版本存储,同样也是分号分隔的字符串列表
VaryByCustom 通过这个属性,你可以自定义怎么来缓存页面
SqlDependency 为当前缓存指定一个依赖项,当发生变动时从缓存区中删除掉当前页面或控件的缓存。
 
就是上面列的着11个属性,大多数时候,只需要DurationVaryByParam这两个属性就搞定了,比如:

<%@ OutputCache Duration="100" VaryByParam="none" %>

上面指令没有指定Location默认是客户端和服务器端都缓存,这个时候如果改变页面的QueryString会被忽略,直接从缓存中返回结果,所以在需要根据参数返回不同内容的页面千万不要这么设置,可以采用以下方式:

<%@ OutputCache Duration="100" VaryByParam="*"%>

上面关于Duration属性,说是必须的,其实也不然,当你不想用缓存是就不必写^_^,如下,禁用当前页面缓存:
<%@ OutputCache Location="None" %>
 
归类于:代码人生 标签:@OutputCache ASPNET Directive
03

ASP.NET: 页面指令 之 @PreviousPageType

接着上回的继续写,这个指令到目前为止没用过,有两个二选一的属性,主要的功能是为当前的页面指定一个强类型的PreviousPage.
 
@PreviousPageType属性(Attributes)
TypeName:指定前置页面的类型名称。
VirtualPath:指定前置页面的虚拟路径。
这两个属性不能同时出现,否则就白填,指令无效。
 
大多数时候应该都用不到这个指令,因为当前页面的PreviousPage的值并不取决于这个指令,而是你调用这个页面的方式,只有跨页面的提交和在服务器端调用Transfer时才会保存前置页面的实例.Page类提供IsPostBack,IsCallback,IsCrossPagePostBack三个属性来判断用户是如何来判断当前页面是如何被调用的。
 
Page.PreviousPage这个属性到目前我也没用过,好像很少需要获取前一个页面的对象实例,大多数情况下,页面间的数据传递都是通过QueryString、Form、Cookie等方式完成了。
 
随着Ajax的不断流行,现在连Server Control用的都少了,可惜MS花了这么大精力构造的WebForm框架.
归类于:代码人生 标签:ASPNET @PreviousPageType
31

ASP.NET:.ashx文件 和 @WebHandler

下班的时候QQ风雨无阻,问她有多久没有主动去看看技术的文章或者书籍了,回答和我现在的状况差不多,N久没看了,不是不想看,而是没时间看,总是有写不完的代码,不写代码时也不想看了,或许有些东西只有需要才会去学吧。
一直以来用Asp.Net写网站程序,基本上只用到.aspx和.ascx两种扩展名,以至于把.ashx忘的光光的,到后来自己用Ajax向服务器发请求时,也是直接请求的aspx页面,既派生于Page的对象,更好的方式应该是使用.ashx来做为Ajax的响应URL,因为ashx页面和WebHandler指令将实例化了一个派生于IHttpHandler的对象,只需要在ProcessRequest方法里写响应代码即可,相对Page显然轻量很多。
 
看了下ASP.NET的所有指令:@Page,@Control,@Import,@Implements,@Register,@Assembly,@Master,@WebHandler,
@PreviousPageType,@MasterType,@OutputCache,@Reference,有12个之多,就挨个再学习一遍吧,从@WebHandler开始。
 
@WebHandler 为Http handler文件(.ashx)定义属性(Attribute)和编译选项。
 
属性
Class 指定一个继承自IHttpHandler的类,当handler被请求时将被实例化用来响应请求。这个属性是必须的
CodeBehind 指定Class对应的文件,基本上没用,主要是用来支持VS显示的,可以去掉。
 
编译选项
Debug 默认是false,所以非调试就不用打开,影响性能,可以省略
Description 关于当前handler的描述,ASP.NET解析时忽略,可能调试时能提供辅助信息,可以省略
Language 默认C# ,可以省略
WarningLevel 0-4 默认我也不知道是几,可以省略。
 
使用ashx的好处就是不需要在Web.Config中配置,就可以直接用IHttpHandler派生类来处理请求,一些常见的应用场景:动态生成图片(比如验证码),响应Ajax请求等。
 
归类于:代码人生 标签:ashx文件 WebHandler
20

从字典模式开始扯

字典模式,这个词是我造的,但这种模式其实已经广泛使用了,比如大家经常使用的数组、集合其实都属于字典模式的应用。字典的特点就是Key/Value(键值对),你只需要提供特定的Key,就能快速获得想要的Value,所以它也是一种求解的思路或技巧,使用字典模式一般有两种场合:
一、缓存。为了提高效率而将运算结果保存起来,需要时直接去字典中取结果即可,牺牲空间提高效率。
二、映射。A->B 是映射关系,计算机无法通过某种方程式算从A得到B,我们只能人工预先做好字典,然后程序中通过调用字典来从A得到B,我们经常使用映射来完成通过计算无法解决的问题。
 
然后通过一些分析一些例子来加深对字典模式的理解:
 
1、暴力破解的字典
2、各种在线词典
3、关键字搜索
 
就这样吧。
 
归类于:代码人生 标签:字典模式