2011年4月18日
之前碰到需要分页的地方,总是很蛋疼,老是要自己写一大堆的分页代码。于是就自己写了个自定义控件,继承自Repeater,IPageableItemContainer,来实现分页。此分页控件是取出所有数据的伪分页,未从Sql入手(懒)。
之后就一直用这个分页控件来分页。代码工作量节省了很多,也就这样傻乎乎的用了好几个月。
BUT,今天问题来了。之前的分页都是小打小闹,要嘛就是几百行的数据,要嘛就是几千行的数据,从没超过万过。今天的数据就要命的超过了万行。页面在显示第一页的时候没有问题,erveryting is ok!但一旦单击第二页的链接,浏览器就显示“无法显示网页”的提示。怀疑是程序问题,设断点,调试。可恶的是一旦点击第二页页面断点就截获不到(果然二)。也就是说请求并没有实现指定页面的访问。。。纳闷ING。。。从HttpModule入手吧,新建HttpModule,可以跑到。
思考良久,认定是第一页所生成的页面造成请求第二页的时候出问题。鼠标右键,查看源文件,哇靠,页面有4M大,再一看,一大堆的ViewState。
锁定问题,禁用分页控件的ViewState(不是整个页面的ViewState)。问题搞定。
原因是应该是HttpModule之后在解析ViewState的时候发现ViewState太大,解析挂了。
SO,ViewState啊ViewState,小心为妙!
2011年3月24日
属性对应的方法在release里面是inline的,而debug不是。
2011年2月27日
最近在看关于box和unbox的内存分配问题,发现一旦值类型调用了基类的方法或接口的时候就会发生装箱操作。因为基类型的方法或接口必须通过TypeHandle获得。由此引出了一个问题。若所执行的方法并不是基类型的虚方法而是值类型自己定义的方法时,CLR又是如何找到值类型的方法代码呢?
对于引用类型,CLR可以通过在堆中的TypeHandle找到其对应的MethodTable,进而定位到此类型的方法代码,编译并执行之。然而值类型是分配在栈上,并没有TypeHandle,它是如何找到方法表的?
。。。
public Struct MyStruct
{
private int a;
private int b;
public void MyMethod()
{
...
}
}
public static void Main()
{
MyStruct m=new MyStruct();
m.ToString();//由于是ValueType的方法,不用装箱。
m.GetType();//Object的方法,所以装箱了。
m.MyMethod();//此处不会装箱,但如何找到方法表?
}
IL:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 36 (0x24)
.maxstack 1
.locals init ([0] valuetype ConsoleApplication2.MyStruct m)
IL_0000: nop
IL_0001: ldloca.s m
IL_0003: initobj ConsoleApplication2.MyStruct
IL_0009: ldloca.s m
IL_000b: constrained. ConsoleApplication2.MyStruct
IL_0011: callvirt instance string [mscorlib]System.Object::ToString()
IL_0016: pop
IL_0017: ldloc.0
IL_0018: box ConsoleApplication2.MyStruct
IL_001d: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
IL_0022: pop
IL_0023: ret
} // end of method Program::Main
2010年12月6日
最近在写一个组织库人员选择的页面,需要用到树。但由于组织库的数据信息比较庞大,故考虑异步加载。
以前一直以为微软的TreeView只能一次性加载所有的树节点信息,不能实现异步,于是乎自己上手,又是ajax,又是javascript,加上一大堆的后台判断和处理代码,最后终于搞定。心里的喜悦不言而喻。
然而今天哥发现了TreeView的Populate,才知道哥又造了遍轮子。但哥还是不服,哥心想自己花了这么多时间写出来的东西总应该有点价值才对吧,于是,哥作了比较,发现TreeView每次异步调用的时候都把所有的页面信息重新提交回后台,重组树信息。而我自己写的只是提交了需要的节点信息。提交的数据量要远小于TreeView。但只是上传的数据量小而已(小小的安慰自己一下)。
最后哥用又微又软的TreeView重新用异步方式写了之前所需的功能,仅花了半天,而之前折腾了将近两天。还附带产生了一大堆的javascript和aspx文件。
这就是哥重复造轮子的过程,不知该喜还是该悲。